Seite 1 von 1
Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 15:06
von ide
Hi
ich bin neu hier und auch noch ein Neuling im Umgang mit Python. Ich möchte Daten aus einer csv datei lesen und bestimmte Werte nachher weiterverwenden. Daher benötige ich die Spalten der Datei. Zunächst einmal hier der relevante Codeschnipsel:
Code: Alles auswählen
file = open("datei.csv")
content = file.read()
file.close()
dataset = content.split("\n")
for data in dataset:
col = data.split(",")
print(col[0])
das mit print(col) funktionier. Dann werden mir alle Datenausgegeben. print(col[0]) geht auch dann erhalte ich alles aus der ersten Spalte. Allerdings geht es aber col[1] nicht mehr --> list index out of range. Nach meinem Verständnis müsste jetzt aber ja eigentlich die 2. Spalte ausgegeben werden.
Die Csv-Datei habe ich mal hochgeladen. Das wird die Sache wahrscheinlich etwas einfacher machen.
datei.csv
Vielen Dank für eure Mühe
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 15:13
von /me
ide hat geschrieben:Ich möchte Daten aus einer csv datei lesen und bestimmte Werte nachher weiterverwenden.
Dann möchtest du das Handling aber bestimmt nicht manuell machen, sondern das
csv Modul aus der Standardbibliothek verwenden.
Der Fehler liegt übrigens darin, dass die zweite Zeile deiner CSV-Datei leer ist. Eine zweite Spalte gibt es somit da nicht.
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 15:24
von ide
/me hat geschrieben:ide hat geschrieben:Ich möchte Daten aus einer csv datei lesen und bestimmte Werte nachher weiterverwenden.
Dann möchtest du das Handling aber bestimmt nicht manuell machen, sondern das
csv Modul aus der Standardbibliothek verwenden.
Der Fehler liegt übrigens darin, dass die zweite Zeile deiner CSV-Datei leer ist. Eine zweite Spalte gibt es somit da nicht.
Hi,
also zur Not würde mir es manuell erstmal reichen.
das ist richtig es gibt keine 2. Zeile. Der Platz bleibt also in der Spalte frei. Aber ich verstehe nicht wieso es dann keine 2. Splate geben sollte. Die erste Spalte wird ja auch mit dem Platzhalter aus der 2. Zeile ausgegeben.
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 15:37
von BlackJack
@ide: Schau Dir doch einfach mal das Ergebnis von `split(',')` auf einer leeren Zeichenkette an. Dann siehst Du warum das mit der ersten Spalte funktioniert.
Du möchtest die CSV-Datei übrigens nicht ohne das `csv`-Modul verarbeiten, denn bei Deiner Beispieldatei sind Textfelder enthalten. Und sobald in einem Textfeld das Trennzeichen vorkommt funktioniert das naive `split()` am Trennzeichen nicht mehr. Und das ist nicht nur theoretisch der Fall sondern kommt sogar in Deinen Beispieldaten tatsächlich vor!
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 15:58
von ide
ok dann muss ich das wohl doch versuchen mit dem csv-modul
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 18:28
von ide
Hi
ich habe nun mal versucht das csv-Modul zu verwenden, stoße allerdings wieder auf das gleiche Problem. Außerdem kann ich jetzt noch nichtmal die erste Spalte bekommen.
Code: Alles auswählen
import csv
with open("C:/Users/Steffen/Desktop/Brick/ordecsv.csv") as csvfile:
readCSV = csv.reader(csvfile, delimiter=",")
for row in readCSV:
print(row)
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 18:37
von EyDu
ide hat geschrieben:ich habe nun mal versucht das csv-Modul zu verwenden, stoße allerdings wieder auf das gleiche Problem. Außerdem kann ich jetzt noch nichtmal die erste Spalte bekommen.
Und der Fehler ist noch immer der selbe wie oben

: Die zweite Zeile ist leer, da gibt es keine Spalten. Das musst du schon testen, bzw. abfangen.
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 18:38
von Sirius3
@ide: Natürlich hast Du immer noch das gleiche Problem, dass die zweite Zeile leer ist. Nur dass das csv-Modul aus einer leeren Zeile eine leere Liste macht und nicht wie split eine leere erste Spalte.
Aber das siehst Du doch auch mit Deinem print-Aufruf.
Das richtige Encoding ist übrigens 'utf-8-sig', da Deine Datei einen BOM hat.
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 19:14
von ide
Hi,
ok ja das leuchtet ein. Bloß ist mir noch nicht klar wie ich auf diese listen dann nun zugreife. Ich bin davon ausgegangen, dass es mit row[] geht. Allerdings ist das wohl nicht der Fall.
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 19:29
von EyDu
Doch, das ist schon der richtige Weg. Die Frage ist einfach, wie du mit leeren oder unvollständigen Zeilen umgehen willst. Der einfachste Weg wäre zum Beispiel, dass du jede Liste auf die richtige Länge prüfst und nur verarbeitest, wenn sie der Erwartung entspricht. Wenn nicht, dann überspringst du die Zeile, wirfst einen Fehler oder gehst irgendwie anders damit um.
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 19:43
von ide
aber dann müsste ich doch jetzt schon auf z.b row[3] zugreifen können oder nicht ? Aber es kommt immer ein Fehler es sei denn ich gebe einfach nur row aus.
ich habe es glaube ich. Ich habe eine Liste angelegt und dann die row in die Liste gepackt und kann nun auf einzelne Werte zugreifen:
Code: Alles auswählen
import csv
daten = []
with open("datei.csv") as csvfile:
readCSV = csv.reader(csvfile, delimiter=",")
for row in readCSV:
daten.append(row)
print(daten[2][0])
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 19:50
von Sirius3
@ide: die Länge einer Zeile bekommst Du mit `len(row)`.
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 19:54
von ide
Sirius3 hat geschrieben:@ide: die Länge einer Zeile bekommst Du mit `len(row)`.
danke.
Wenn ich dann nun einen Wert ausgeben lasse: z.B "€3.65", gibt es dann die Möglichkeit diesen Wert ohne "€" auszugeben oder kann man nur den gesamt Listeneintrag ausgeben und weiterverarbeiten ?
Re: Problem mit csv lesen spalten
Verfasst: Mittwoch 5. November 2014, 20:13
von cofi
Ich lege dir nahe ein Python Tutorial zu lesen, z.B das in der Python Dokumentation (oder in der Uebersetzung).
Natuerlich kannst du einen Eintrag veraendern, wenn du mit dem CSV Reader eine Zeile liest bekommst du ein ganz normales Listenobjekt zurueck das Strings enthaelt.
Im konkreten Fall wuerde man vielleicht folgendes machen:
Code: Alles auswählen
for row in reader:
row[3] = row[3].lstrip("€")
process_row(row)