Seite 1 von 1

csv-Datei einlesen

Verfasst: Mittwoch 11. Februar 2009, 12:00
von Jeremy
Hallo zusammen,

ich habe eine Frage zum Einlesen von csv-Dateien. In meiner Datei sind die Zeilen unterschiedlich lang, die erte hat z.B. 6 Einträge, die zweite Zeile hat nur 3.
Wenn die Datei mit csv.reader(open("dateiname.csv","rb"),delimiter =";") eingelesen wird, erhalte ich eine Fehlermeldung:

SyntaxError: unexpected EOF while parsing

Was soll mir das sagen? Müssen alle Zeile der DAtei die gleiche Länge haben?

Gruß Jeremy

Verfasst: Mittwoch 11. Februar 2009, 12:04
von ms4py
http://de.wikipedia.org/wiki/CSV_(Dateiformat) hat geschrieben: Jeder Datensatz sollte laut RFC 4180, Absatz 2, Punkt 4 die gleiche Anzahl Spalten enthalten – dies wird aber nicht immer eingehalten.
Dieses Modul setzt das wohl vorraus.

Dann musst du deinen Zeilen halt manuell mit split(";") aufteilen und auswerten.

Verfasst: Mittwoch 11. Februar 2009, 12:08
von helduel
Moin,

bei mir funzt das aber:
foo.csv

Code: Alles auswählen

Foo;Bar;Blubb
Foo2;Bar2
Foo

Code: Alles auswählen

import csv

r = csv.reader(open("foo.csv", "rb"), delimiter=";")
for l in r:
    print l
Ergibt:

Code: Alles auswählen

['Foo', 'Bar', 'Blubb']
['Foo2', 'Bar2']
['Foo']
Muss also an was anderen liegen. Wie sieht denn deine Datei aus?

Gruß,
Manuel

Verfasst: Mittwoch 11. Februar 2009, 12:48
von Jeremy
Meine Datei sieht so aus:

LAMINA;160300;160100;0.351;59400;64600;64600
ISOTROPIC;210000;0.3;;;;
ISOTROPIC;210000;0.3;;;;
ISOTROPIC;210000;0.3;;;;
ISOTROPIC;210000;0.3;;;;
LAMINA;140000;140000;0.284;78000;105000;105000
LAMINA;140000;140000;0.284;78000;105000;105000

Also muss ich die leeren Zellen für die Zeilen 2 - 5 mit Nullen auffüllen und diese dann später wieder rausfiltern.

Oder gibt es eine andere Möglichkeit?

Verfasst: Mittwoch 11. Februar 2009, 13:27
von helduel
An den Daten selbst kann es nicht liegen. Bei mir funktioniert es zumindest. Unter welchem System arbeitest du denn? Hast du schonmal das probiert, die Datei normal, also nicht im binären Modus zu öffnen?

Verfasst: Mittwoch 11. Februar 2009, 13:30
von ms4py
Ja, einen Parser für die Datei selber schreiben.
Weiß ja nicht, was du alles an Funktionen benötigst, aber die Möglichkeiten von csv.reader sind ja nicht wirklich komplex.

Code: Alles auswählen

f = open("datei.csv", "r")
for line in f:
  row = line.split(";")
  print row
Das ist ja schon mal die wichtigste Funktionalität.
Weiß ja nicht, ob du überhaupt mehr benötigst...

Verfasst: Mittwoch 11. Februar 2009, 14:11
von Jeremy
Ich nutze Python als Skriptsprache für die FEM-Software Abaqus unter Windows XP. Die Daten die ich einlesen möchte, beschreiben das Material für mein FE-Modell.
Wenn ich die Datei nicht im binären Modus öffne, kommt die gleiche Fehlermeldung.
Ich schreibe mir jetzt eine Funktion, mit der ich die Nullen dann aus der Liste trenne.

an helduel: Wie hat das bei dir funktioniert?

Verfasst: Mittwoch 11. Februar 2009, 14:17
von Trundle
Ich bezweifle stark, dass die Ausnahme vom csv-Modul geworfen wird, sondern von einer anderen Stelle im Code kommt.

Verfasst: Mittwoch 11. Februar 2009, 14:32
von Pekh
Das mit den Nullen einfügen ist definitiv Quatsch. Ich habe schon dutzende csv-Dateien über das Modul eingelesen, bei denen einige Felder in der oben beschriebenen Weise leer waren.

Ich tippe ebenfalls darauf, daß der Fehler von einer anderen Stelle herrührt. Vor allem weil er sich sonst wohl eher über ein EOL (=End of Line) oder eine ungenügende Spaltenzahl beschweren würde, als über ein Ende der Datei (EOF).

Verfasst: Mittwoch 11. Februar 2009, 14:42
von helduel
Das vermute ich auch. Ich habe mal mit Steuerzeichen in der Datei rumgespielt. So eine Fehlermeldung kam nie.

@Jeremy: Poste doch mal den Context des Codes.
Meine Ausgabe mit dem Python Code von oben war übrigens:

Code: Alles auswählen

['LAMINA', '160300', '160100', '0.351', '59400', '64600', '64600']
['ISOTROPIC', '210000', '0.3', '', '', '', '']
['ISOTROPIC', '210000', '0.3', '', '', '', '']
['ISOTROPIC', '210000', '0.3', '', '', '', '']
['ISOTROPIC', '210000', '0.3', '', '', '', '']
['LAMINA', '140000', '140000', '0.284', '78000', '105000', '105000']
['LAMINA', '140000', '140000', '0.284', '78000', '105000', '105000 ']

Gruß,
Manuel

edit: falsche Python-Ausgabe gepostet :-/

Verfasst: Mittwoch 11. Februar 2009, 14:55
von Jeremy
Wenn ich die Datei über die Python Shell öffne, erhalten ich keine Fehlermeldung und die Ausgabe ist identisch mit der von helduel. Da liegt der Fehler also nicht.
Ich nehme an, dass das irgendwas mit Abaqus zutun hat, so eine Problematik hatte ich schon mal in einem anderen Fall. Da habe ich in der Python-Shell getestet und beim Einlesen als Abaqus-Skript hat es nicht funktioniert.

Vielen Dank für eure Hilfe.