csv-Datei einlesen

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
Jeremy
User
Beiträge: 48
Registriert: Samstag 29. November 2008, 19:05

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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
Zuletzt geändert von ms4py am Mittwoch 11. Februar 2009, 12:09, insgesamt 1-mal geändert.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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
Jeremy
User
Beiträge: 48
Registriert: Samstag 29. November 2008, 19:05

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?
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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...
Jeremy
User
Beiträge: 48
Registriert: Samstag 29. November 2008, 19:05

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?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Ich bezweifle stark, dass die Ausnahme vom csv-Modul geworfen wird, sondern von einer anderen Stelle im Code kommt.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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).
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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 :-/
Jeremy
User
Beiträge: 48
Registriert: Samstag 29. November 2008, 19:05

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.
Antworten