Seite 1 von 1
csv-File einlesen/ error= (list index out of range)
Verfasst: Donnerstag 2. Juli 2015, 11:02
von Rompastompa
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
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Donnerstag 2. Juli 2015, 11:13
von cofi
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:
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Donnerstag 2. Juli 2015, 11:28
von Rompastompa
Besten Dank.
Beim nächsten mal weiss ich bescheid was den Code angeht.
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Donnerstag 2. Juli 2015, 12:19
von Rompastompa
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.
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Donnerstag 2. Juli 2015, 12:33
von cofi
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.
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Donnerstag 2. Juli 2015, 13:04
von 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)):
# ...
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Donnerstag 2. Juli 2015, 14:13
von Kebap
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)
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Freitag 3. Juli 2015, 10:46
von Rompastompa
# ...[/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.
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Freitag 3. Juli 2015, 10:54
von Sirius3
@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?
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Freitag 3. Juli 2015, 11:09
von Rompastompa
Rompastompa hat geschrieben:Wie viele Dateien, die exakt '.csv' heißen glaubst Du, sind in dem Verzeichnis?
Es sind alles '.csv' Dateien.
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Freitag 3. Juli 2015, 11:53
von Sirius3
@Rompastompa: es kann maximal eine geben. Aber ich bin mir ziemlich sicher, dass bei Deinen Dateinamen vor dem Punkt noch etwas steht.
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Freitag 3. Juli 2015, 12:10
von Rompastompa
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
...
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Freitag 3. Juli 2015, 12:18
von cofi
Die Dokumentation zu
glob ist nicht lang, lies sie (nochmal) und dann weisst du wie du es richtig aufrufen musst.
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Freitag 3. Juli 2015, 12:29
von bwbg
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).
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Freitag 3. Juli 2015, 12:37
von Rompastompa
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:
"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
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Freitag 3. Juli 2015, 12:39
von Dav1d
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).
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Freitag 3. Juli 2015, 13:21
von Rompastompa
@Cofi
meinst du denn das "glob" dafür die bessereFunktion ist ?
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Freitag 3. Juli 2015, 14:27
von cofi
?! Das ist doch genau die Funktion die du (falsch) benutzt?
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Montag 6. Juli 2015, 13:54
von Rompastompa
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])
Re: csv-File einlesen/ error= (list index out of range)
Verfasst: Montag 6. Juli 2015, 14:05
von 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.