Forum: PC-Programmierung Python CSV Felder lesen


von python dummie (Gast)


Lesenswert?

Ich möchte mit Python eine CSV-Datei lesen (in der 2. Zeile ist das 
letzte Feld absichtlich leer)

bank.csv
1
Mueller Hans;DE120300001234567890;88.51;Eier und Milch
2
Schmidt Klaus;DE773501100987654321;1203.56;

Ich habe mal ein Miniprogramm geschrieben
1
import csv
2
with open('bank.csv', 'rb') as csvfile:
3
    datei = csv.reader(csvfile, delimiter=';')
4
    for row in datei:
5
        print row

Das Ergebnis ist
1
['Mueller Hans', 'DE120300001234567890', '88.51', 'Eier und Milch']
2
['Schmidt Klaus', 'DE773501100987654321', '1203.56', 'Kaese und Butter']

Wie kann ich jetzt auf das 3. Feld in der 1. Zeile zugreifen (88.51)?

print row[0:1] liefert ['Schmidt Klaus']
print row[1:2] liefert ['DE773501100987654321']
print row[0:3] liefert ['Schmidt Klaus', 'DE773501100987654321']

alles nur aus der letzten Zeile

von Bernd K. (prof7bit)


Lesenswert?

python dummie schrieb:
> Ich möchte mit Python eine CSV-Datei lesen (in der 2. Zeile ist
> das
> letzte Feld absichtlich leer)
>
> bank.csvMueller Hans;DE120300001234567890;88.51;Eier und Milch
> Schmidt Klaus;DE773501100987654321;1203.56;

Wo kommt dann unten "Kaese und Butter" her?

>with open('bank.csv', 'rb') as csvfile:
>    datei = csv.reader(csvfile, delimiter=';')

'r' und nicht 'rb' oder warum willst Du binär lesen?

> ['Mueller Hans', 'DE120300001234567890', '88.51', 'Eier und Milch']
> ['Schmidt Klaus', 'DE773501100987654321', '1203.56', 'Kaese und Butter']
>
> Wie kann ich jetzt auf das 3. Feld

row[2]

> print row[0:1] liefert ['Schmidt Klaus']
> print row[1:2] liefert ['DE773501100987654321']
> print row[0:3] liefert ['Schmidt Klaus', 'DE773501100987654321']
> alles nur aus der letzten Zeile


> Wie kann ich jetzt auf das 3. Feld in der 1. Zeile zugreifen (88.51)?

1
import csv
2
3
with open('bank.csv', 'r') as csvfile:
4
    datei = csv.reader(csvfile, delimiter=';')
5
    print(list(datei)[0][2])

Erst machen wir mit list() aus dem iterator (welcher nur vorwärts lesen 
kann) eine echte Liste im Speicher welche man wahlfrei indizieren kann, 
dann haben wir also eine Liste von Zeilen oder eine Liste von Listen von 
Strings und dann nehmen wir von dieser zweidimensionalen Struktur das 
zweite Element des nullten Elements (zweite Spalte der nullten Zeile).

1
--($)-- python3 "unbenannt.py"
2
88.51

Mission erfüllt.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

python dummie schrieb:
> alles nur aus der letzten Zeile

Weil row die letzte Zeile ist. Du bist mit der for-Schleife Zeile für 
Zeile durchgegangen, und nach der Schleife bleibt eben die letzte Zeile 
in row stehen.

python dummie schrieb:
> Wie kann ich jetzt auf das 3. Feld in der 1. Zeile zugreifen (88.51)?

Du kannst nicht direkt eine spezifische Zeile aus der Datei einlesen. Du 
kannst nur über die Zeilen iterieren, und wenn die Zeile kommt, die dich 
interessiert, das rauslesen, was du brauchst. Oder du musst erstmal die 
ganze Datei in den Speicher lesen, wie es Bernd gezeigt hat. Dann kannst 
du per Index auf die Zeilen zugreifen.

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

1
#!/usr/bin/python
2
3
4
import csv
5
6
with open('bank.csv', 'r') as csvfile:
7
    datei = csv.reader(csvfile, delimiter=';')
8
    print(next(datei)[2])

Das würde nur die erste Zeile lesen.

Datei ist ein iterator, mit next() bekommt man nur den nächsten Eintrag, 
mit list() bekommt man alle Einträge als Liste (implizit ruft das so 
lange next() auf bis der iterator am Ende ist und liefert dann eine 
Liste zurück).

Alle Objekte die das iterator-Interface implementieren wie in diesem 
Fall das csv.reader Objekt kann man in "for in" Schleifen verwenden, das 
ruft intern auch nur wiederholt next() auf. Aber nur Listen die im 
Speicher liegen kann man direkt wahlfrei mit [] indizieren.

von python dummie (Gast)


Lesenswert?

Danke. "list" ist das, was ich gesucht habe.

von Bernd K. (prof7bit)


Lesenswert?

python dummie schrieb:
> Danke. "list" ist das, was ich gesucht habe.

Das zieht aber die komplette Datei in den Speicher weil es den iterator 
zwingt bis zum Ende durchzugehen. Wenn Du nur die ersten paar Zeilen 
brauchst würde ich next() nehmen oder die for Schleife frühzeitig 
abbrechen, dann wird auch nur der Teil von der Festplatte gelesen, ein 
Iterator ist faul und liest oder erzeugt nur was angefordert wird.

von Rolf M. (rmagnus)


Lesenswert?

Bernd K. schrieb:
> python dummie schrieb:
>> Danke. "list" ist das, was ich gesucht habe.
>
> Das zieht aber die komplette Datei in den Speicher weil es den iterator
> zwingt bis zum Ende durchzugehen. Wenn Du nur die ersten paar Zeilen
> brauchst würde ich next() nehmen oder die for Schleife frühzeitig
> abbrechen, dann wird auch nur der Teil von der Festplatte gelesen, ein
> Iterator ist faul und liest oder erzeugt nur was angefordert wird.

Auch wenn man alles braucht, aber nicht zwingend in wahlfreier 
Reihenfolge, kann man einfach per for-Schleife durchiterieren, statt 
erst alles komplett in den Speicher zu lesen.

von TigerClaw (Gast)


Lesenswert?

Versuchs mal mit Pandas. Damit ist es wesentlich einfacher
1
df = pd.read_csv('file.csv', delimiter=';',  header=None,engine='python')

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.