Python CSV DictReader / Writer Fragen
Frage
Ich versuche, ein paar Zeilen aus einer CSV-Datei zu extrahieren und sie in eine anderen schreiben, aber ich habe einige Probleme.
import csv
f = open("my_csv_file.csv", "r")
r = csv.DictReader(f, delimiter=',')
fieldnames = r.fieldnames
target = open("united.csv", 'w')
w = csv.DictWriter(united, fieldnames=fieldnames)
while True:
try:
row = r.next()
if r.line_num <= 2: #first two rows don't matter
continue
else:
w.writerow(row)
except StopIteration:
break
f.close()
target.close()
Ausführen dieser, bekomme ich folgende Fehlermeldung:
Traceback (most recent call last):
File "unify.py", line 16, in <module>
w.writerow(row)
File "C:\Program Files\Python25\lib\csv.py", line 12
return self.writer.writerow(self._dict_to_list(row
File "C:\Program Files\Python25\lib\csv.py", line 12
if k not in self.fieldnames:
TypeError: argument of type 'NoneType' is not iterable
Nicht ganz sicher, was ich bin dong falsch.
Lösung
Ich weiß es auch nicht, aber da alles, was Sie ist das Kopieren von Zeilen aus einer Datei in einer anderen tust, warum sind Sie überhaupt mit der csv
Sache stören? Warum nicht so etwas wie:
f = open("my_csv_file.csv", "r")
target = open("united.csv", 'w')
f.readline()
f.readline()
for line in f:
target.write(line)
Andere Tipps
Um die Verwirrung über den Fehler zu klären: Sie es bekommen, weil r.fieldnames
nur gesetzt wird, wenn Sie aus der Eingabedatei zum ersten Mal mit r
lesen. Daraus ergibt sich die Art und Weise Sie es schrieb, fieldnames
wird immer auf None
initialisiert werden.
Sie können w = csv.DictWriter(united, fieldnames=fieldnames)
mit r.fieldnames
initialisieren erst, nachdem Sie die erste Zeile von r
lesen, was bedeutet, dass Sie Ihren Code würde restrukturieren.
Dieses Verhalten wird in der Python Standard Library Dokumentation dokumentiert
DictReader Objekte haben folgende öffentliche Attribut:
csvreader.fieldnames
Wenn nicht als Parameter übergibt, wenn Sie das Objekt erstellen, dieses Attribut beim ersten Zugriff initialisiert wird, oder wenn der erste Datensatz aus der Datei gelesen wird.
Wie für die Ausnahme, sieht aus wie diese Zeile:
w = csv.DictWriter(united, fieldnames=fieldnames)
sollte
w = csv.DictWriter(target, fieldnames=fieldnames)
Der Grund, warum Sie die Fehler sind immer ist sehr wahrscheinlich, dass Ihre ursprüngliche CSV-Datei (my_csv_file.csv) nicht über eine Kopfzeile. Wenn Sie also den Leser-Objekt erstellen, wird dessen Feldnamen Feld None
gesetzt.
Wenn Sie versuchen, eine Zeile mit dem Schriftsteller zu schreiben, überprüft er zunächst, um sicherzustellen, gibt es keine Tasten im dict, die nicht in der Liste der bekannten Felder sind. Da fieldnames
wird auf einen Versuch, None
, dereferenzieren die Schlüsselnamen eine Ausnahme auslöst.