mikrocontroller.net

Forum: PC-Programmierung Python CSV Felder lesen


Autor: python dummie (Gast)
Datum:

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

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

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

Das Ergebnis ist
['Mueller Hans', 'DE120300001234567890', '88.51', 'Eier und Milch']
['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

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht 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)?

import csv

with open('bank.csv', 'r') as csvfile:
    datei = csv.reader(csvfile, delimiter=';')
    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).

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

Mission erfüllt.

: Bearbeitet durch User
Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#!/usr/bin/python


import csv

with open('bank.csv', 'r') as csvfile:
    datei = csv.reader(csvfile, delimiter=';')
    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.

Autor: python dummie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. "list" ist das, was ich gesucht habe.

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TigerClaw (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.