2017-11-14 2 views
0

Beim Lesen von CSV-Dateien sind manchmal die erste Zeile (oder mehrere) Header, die wir nicht in unsere Daten aufnehmen möchten.wie csv.reader-Header korrekt behandelt werden

Wenn ich brauche nicht die Daten aus dem Header ich next kurz vor dem Leser zu erklären (wenn mehr als eine Zeile für Header verwendet wird, kann ich nächste mehrmals aufrufe):

with open('myfile.csv', 'rb') as f: 
    next(f)       #skip first row 
    reader = csv.reader(f) 
    for row in reader: 
     #process my data 

Manchmal jedoch Ich möchte die Header nicht in meine Daten aufnehmen, benötige aber immer noch ihre Werte. In diesem Fall transformiere ich die csv.reader in eine Liste und handle die Header getrennt.

with open('myfile.csv', 'rb') as f: 
    reader = list(csv.reader(f)) 

    my_header = reader.pop(0) #remove header 

    for row in reader: 
     #process my data 

Das funktioniert und ich bin glücklich darüber. Aber ich bin mir nicht sicher, ob es der "Best Practice" Weg ist, csv.reader zu verwenden, und es gibt andere Wege, die es wert sind, erforscht zu werden.

+0

siehe ['pandas.read_csv()'] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html), was ein sehr mächtiger und vielseitiger Leser ist. –

+0

Dies ist ein Rezept für eigensinnige Kommentare und Antworten. Aber Sie müssen den "Leser" nicht in eine "Liste" umwandeln. 'my_header = next (reader)' sollte die Kopfzeile bekommen, wenn Sie sie brauchen. – Abdou

Antwort

3

Es ist in der Tat nicht die beste Praxis - es liest die ganze Datei ohne besonderen Grund im Speicher. Die lustige daran ist, dass es fast nichts zu Ihrem ersten Schnipsel zu ändern, um die Header zu bekommen ...

next(iterator)tut das „aktuelle“ Element zurück:

>>> it = iter(["hello", "world"]) 
>>> next(it) 
'hello' 
>>> next(it) 
'world' 
>>> next(it) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 

Also alles, was Sie tun müssen, ist,

with open('myfile.csv', 'rb') as f: 
    reader = csv.reader(f) 
    headers = next(reader) 
    for row in reader: 
     #process my data 

FWIW, wie du „die erste Zeile“ in Ihrem ersten Schnipsel überspringen ist spröde - Sie Skipping tatsächlich die erste Linie, die nicht unbedingt die erste Reihe (einige CSV-Format Zeilenumbrüche in Reihen eingebettet haben), so dass für die „no-Header“ -Version Sie eigentlich wollen:

with open('myfile.csv', 'rb') as f: 
    reader = csv.reader(f) 
    next(reader) # skip first row 
    for row in reader: 
     #process my data 
0

Eine einfache Möglichkeit, Ihre CSV-Datei mit Kopfzeile organisiert zu verwenden und dann die Werte: csv + DictReader ex:

with open ('myfile.csv', 'r') as csv_file: 
csv_reader = csv.DictReader (csv_file) 
     for row in csv_reader: 
         print (row.get ('column1')) # print the value of column1 without title 

Mit dieser Methode können Sie Ihre Kopfzeile und genau zielen auf die Daten, die Sie brauchen, und Ihr Code sauberer ignorieren. Gib mir eine Rückkehr, bis später.

+0

Aber manchmal möchte ich den Header nicht ignorieren, sondern nur getrennt vom Rest der Daten verarbeiten. –

Verwandte Themen