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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top