csv-File einlesen/ error= (list index out of range)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Rompastompa
User
Beiträge: 18
Registriert: Freitag 24. April 2015, 12:26

Moin Leute,

ich bastele an folgendem Code:

Code: Alles auswählen

import csv #(csv -> Komma seperated Variables)

with open('Velocity Radial Streamwise 1,00.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    cr1 = []
    
    for row in reader:
        cr = row[0]
        cr1.append(cr)

    print(cr1)
Dabei bekomme ich folgenden Error: list index out of range
Die Daten auf die ich zugriff haben möchte fangen eh erst ab der 6ten Reihe an, aber es ist auch noch eine leere Reihe enthalten die vermutlich diesen Fehler hervorruft.

Kann mir da einer nen Rat geben wie ich bei solchen Tabellen vorgehen sollte.

Vielen Dank schonmal
Zuletzt geändert von cofi am Donnerstag 2. Juli 2015, 11:10, insgesamt 1-mal geändert.
Grund: Code Markup korrigiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Bitte setze deinen Code in _Python_ Tags. Den Knopf fuer fetten Text hast du ja schon gefunden, der fuer Code ist direkt daneben.

Nun, du solltest ueberpruefen, ob deine Reihen das Format haben, dass du erwartest.
Wenn du nur eine leere Reihe abfangen musst:

Code: Alles auswählen

for row in reader:
    if row:
        cr1.append(row[0])
Rompastompa
User
Beiträge: 18
Registriert: Freitag 24. April 2015, 12:26

Besten Dank.

Beim nächsten mal weiss ich bescheid was den Code angeht.
Rompastompa
User
Beiträge: 18
Registriert: Freitag 24. April 2015, 12:26

Ok, also so richtig funktionieren tut es dann doch nicht es sei denn man bezieht die 5 (next(reader.None) mit ein.

Code: Alles auswählen

with open('Velocity Radial Streamwise 1,00.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    next(reader, None)
    next(reader, None)
    next(reader, None)
    next(reader, None)
    next(reader, None)

    cr1 = []
    Span1 = []
    
    for row in reader:
        if row:
            cr1.append(row[0])
            Span1.append(row[1])

plt.plot(cr1,Span1, 'b', linewidth=3)
#plt.spines['top'].set_color('c')
plt.title('Radial Velocity')
plt.xlabel('Radial Velocity')
plt.ylabel('Span')
plt.show()
Es geht im übrigen nur um floats.
Zuletzt geändert von Rompastompa am Donnerstag 2. Juli 2015, 12:34, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

for i, row in enumerate(reader):
    if i < 5:
        continue
    if row:
        ...
Da du schon matplotlib benutzt kannst du dir auch mal die Mittel, die Numpy zum einlesen von Daten bereitstellt, anschauen.
Die koennen zum Beispiel so eine Praeambel ueberspringen.
BlackJack

Ich würde an der Stelle `itertools.islice()` verwenden und anstelle des ``if`` eventuell `itertools.ifilter()`:

Code: Alles auswählen

for row in ifilter(bool, islice(reader, 5, None)):
    # ...
Benutzeravatar
Kebap
User
Beiträge: 760
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Rompastompa hat geschrieben: Dabei bekomme ich folgenden Error: list index out of range

Kann mir da einer nen Rat geben
Bitte zeige immer die komplette Fehlermeldung (sie besteht aus mehreren Zeilen)
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Rompastompa
User
Beiträge: 18
Registriert: Freitag 24. April 2015, 12:26

# ...[/code][/quote]
BlackJack hat geschrieben:Bitte zeige immer die komplette Fehlermeldung (sie besteht aus mehreren Zeilen)
Joo, werde ich beim nächsten mal machen.

Ich bräuchte da nochmal ein paar Antwordten.

Bisher ging es mir ja nur darum ein File einzulesen, allerdings geht es mir mehr um ganze Ordner mit jeweils 100 files mit der gleichen Benennung, also wie folgt:
Velocity Radial Streamwise 1,00.csv
Velocity Radial Streamwise 1,02.csv
Velocity Radial Streamwise 1,04.csv
...

Wäre der Befehl "glob" hier die richtige Wahl?
Ich möchte halt alle Daten aus einem Ordner mit 100 Files in ein Diagramm schreiben.
Danach soll er den nächsten ordner öffnen und das gleich von vorne.

Folgendes habe ich bisher versucht:

Code: Alles auswählen

import csv #(csv -> Komma seperated Variables)
from math import *
from Tkinter import *
import numpy as np
import matplotlib.pyplot as plt
import glob

path = ('C:\Python Programme')
f = glob.glob(path + '/.csv')
for file in f:
    f=open(file)
    cr1 = []
    Span1 = []
    for i, row in enumerate(reader):
        if i < 5:
            continue
        if row:
            cr1.append(row[0])
            Span1.append(row[1])

plt.plot(cr1,Span1, 'b', linewidth=3)
#plt.spines['top'].set_color('c')
plt.title('Radial Velocity')
plt.xlabel('Radial Velocity')
plt.ylabel('Span')
#plt.xlim([0,60])
plt.ylim([0,1])
plt.show()
Daruf gibt es dann folgenden Fehler:
File "C:/Python Programme/csv-reader-3.py", line 25, in <module>
plt.plot(cr1,Span1, 'b', linewidth=3)
NameError: name 'cr1' is not defined


Mir ist schon klar das er die Werte garnicht erst einliest nur weiss ich auch nicht warum.
Aber vielleicht gibt es dabei ja auch noch ein andere Lösung.

Viele Dank schonmal vorab

PS: Ich find es echt großartig das es dieses Forum gibt.
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

@Rompastompa: im letzten Post von Dir sah der Code doch noch viel besser aus (with benutzt, reader defniert, usw). Du solltest keine *-Import benutzen, Pfade mit os.path.join zusammensetzen und darauf aufpassen, dass '\' ein Escape-Zeichen ist. Blackjacks islice ist um einiges besser Lesbar als diese enumerate-Konstrukt.

Wie viele Dateien, die exakt '.csv' heißen glaubst Du, sind in dem Verzeichnis?
Rompastompa
User
Beiträge: 18
Registriert: Freitag 24. April 2015, 12:26

Rompastompa hat geschrieben:Wie viele Dateien, die exakt '.csv' heißen glaubst Du, sind in dem Verzeichnis?
Es sind alles '.csv' Dateien.
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

@Rompastompa: es kann maximal eine geben. Aber ich bin mir ziemlich sicher, dass bei Deinen Dateinamen vor dem Punkt noch etwas steht.
Rompastompa
User
Beiträge: 18
Registriert: Freitag 24. April 2015, 12:26

Sirius3 hat geschrieben:@Rompastompa: es kann maximal eine geben. Aber ich bin mir ziemlich sicher, dass bei Deinen Dateinamen vor dem Punkt noch etwas steht.
Könnte sein, hehe.

Velocity Radial Streamwise 1,00.csv
Velocity Radial Streamwise 1,02.csv
Velocity Radial Streamwise 1,04.csv
...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Die Dokumentation zu glob ist nicht lang, lies sie (nochmal) und dann weisst du wie du es richtig aufrufen musst.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Funktionen lösen Dein Problem. Schreibe Funktionen für jeden noch so kleinen Mist. Das Erzeugen der Dateinamen gehört in eine Funktion. Zum Beispiel "get_filenames". Jetzt prüfe im interaktiven Interpreter, ob die Funktion die Werte zurück gibt, welche Du erwartest: Interpreter starten -> Modul importieren -> Funktion ggf. mit Parametern aufrufen -> ist Rückgabewert wie erwartet?

So verfährst Schrittweise mit Deinem Programm. Für jede Aufgabe erstellst eine oder mehrere Funktionen (Dateinamen erzeugen, Datei auslesen und in eine sinnvolle Datenstruktur überführen, Datenstruktur plotten, ...).

Damit das überhaupt funktioniert, halte Dich an das so genannte Main-Idiom und führe keinen Code auf Modulebene (außerhalb einer Funktion aus).
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Rompastompa
User
Beiträge: 18
Registriert: Freitag 24. April 2015, 12:26

Ich hab mal den Teil mit den if Anfragen, durch die von BlackJack angegebene Alternative ersetzt.

Leider krieg ich hier einen Error:

File "C:/Python Programme/csv-reader-4.py", line 18, in <module>
for row in ifilter(bool, islice(reader, 5, None)):
NameError: name 'ifilter' is not defined


Ich find die Ideensammlung ja echt super aber da ich noch relativ neu bin in Python, fällt es mir manchmal schwer das sofort nachvollziehen zu können und die Dokumentation ist auch nicht immer hilfreich.

Das gilt auch für diesen Auschnitt:

Code: Alles auswählen

for row in ifilter(bool, islice(reader, 5, None)):
"bool" steht für ja oder nein oder True und False, nehme ich mal an.
"islice" steht für ???
"None" steht für: setzte alle Werte vor der 5ten Zeile auf None
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Hier findest du was du brauchst: https://docs.python.org/3/library/itertools.html

`ifilter` gibts nur noch in Python 2 (`itertools` modul). -> https://docs.python.org/2/library/itertools.html.

Auf Google gehen, nach `ifilter python` suchen, link anklicken, das funktioniert ziemlich gut (erstze `ifilter` mit der Funktion die gerade brauchst, ersetze `Google` mit einer Suchmaschine deiner Wahl).
the more they change the more they stay the same
Rompastompa
User
Beiträge: 18
Registriert: Freitag 24. April 2015, 12:26

@Cofi

meinst du denn das "glob" dafür die bessereFunktion ist ?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

?! Das ist doch genau die Funktion die du (falsch) benutzt?
Rompastompa
User
Beiträge: 18
Registriert: Freitag 24. April 2015, 12:26

Hey ho,

ich habe mich jetzt soweit vorran gearbeitet, sodass ich mit dem Befehl 'Glob' schonmal die Dateien einlesen kann.
Es wird zwar keine Fehlermeldung angezeigt allerdings werden die Daten nicht in die Liste geschrieben.

Wo liegt mein Problem?

Code: Alles auswählen

#path = ('C:\Python Programme')
f = glob.glob('*.csv')
reader = csv.reader(f, delimiter=',')
cr1 = []
Span = []
for row in itertools.ifilter(bool, itertools.islice(reader, 5, None,)):
    cr1.append(row[0])
    Span1.append(row[1]) 
BlackJack

@Rompastompa: `glob()` liest keine Dateien ein und Du möchtest `f` vielleicht mal einen Namen geben der auch was aussagt und diese Aussage dann mit dem tatsächlichen Wert vergleichen. Und bei `csv.reader()` nachschauen was diese Funktion aus dem Wert macht. Nicht das was Du denkst. Das kann man auch alles interaktiv mal in einer Python-Shell durchgehen um ein Gefühl dafür zu bekommen.
Antworten