Problem mit csv lesen spalten

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
ide
User
Beiträge: 15
Registriert: Mittwoch 5. November 2014, 14:50

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
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
ide
User
Beiträge: 15
Registriert: Mittwoch 5. November 2014, 14:50

/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.
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!
ide
User
Beiträge: 15
Registriert: Mittwoch 5. November 2014, 14:50

ok dann muss ich das wohl doch versuchen mit dem csv-modul
ide
User
Beiträge: 15
Registriert: Mittwoch 5. November 2014, 14:50

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)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
ide
User
Beiträge: 15
Registriert: Mittwoch 5. November 2014, 14:50

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
ide
User
Beiträge: 15
Registriert: Mittwoch 5. November 2014, 14:50

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])
Zuletzt geändert von ide am Mittwoch 5. November 2014, 19:50, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@ide: die Länge einer Zeile bekommst Du mit `len(row)`.
ide
User
Beiträge: 15
Registriert: Mittwoch 5. November 2014, 14:50

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 ?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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