Einige Optionen:
(1) Erstellen Sie mühsam ein Identitätszuordnungsdiktat (dh nichts tun) aus Ihren Feldnamen, damit csv.DictWriter es wieder in eine Liste konvertieren und an eine csv.writer-Instanz übergeben kann.
(2) In der Dokumentation wird "die zugrunde liegende writer
Instanz" erwähnt. Verwenden Sie sie einfach (Beispiel am Ende).
dw.writer.writerow(dw.fieldnames)
(3) Vermeiden Sie den Aufwand für csv.Dictwriter und machen Sie es selbst mit csv.writer
Daten schreiben:
w.writerow([d[k] for k in fieldnames])
oder
w.writerow([d.get(k, restval) for k in fieldnames])
Anstelle der extrasaction
"Funktionalität" würde ich es vorziehen, sie selbst zu codieren. Auf diese Weise können Sie ALLE "Extras" mit den Schlüsseln und Werten melden, nicht nur den ersten zusätzlichen Schlüssel. Ein echtes Ärgernis bei DictWriter ist, dass Sie, wenn Sie die Schlüssel selbst überprüft haben, während jedes Diktat erstellt wurde, daran denken müssen, extrasaction = 'ignore' zu verwenden, da es sonst langsam wird (Feldnamen sind eine Liste). Wiederholen Sie die Prüfung:
wrong_fields = [k for k in rowdict if k not in self.fieldnames]
============
>>> f = open('csvtest.csv', 'wb')
>>> import csv
>>> fns = 'foo bar zot'.split()
>>> dw = csv.DictWriter(f, fns, restval='Huh?')
# dw.writefieldnames(fns) -- no such animal
>>> dw.writerow(fns) # no such luck, it can't imagine what to do with a list
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\python26\lib\csv.py", line 144, in writerow
return self.writer.writerow(self._dict_to_list(rowdict))
File "C:\python26\lib\csv.py", line 141, in _dict_to_list
return [rowdict.get(key, self.restval) for key in self.fieldnames]
AttributeError: 'list' object has no attribute 'get'
>>> dir(dw)
['__doc__', '__init__', '__module__', '_dict_to_list', 'extrasaction', 'fieldnam
es', 'restval', 'writer', 'writerow', 'writerows']
# eureka
>>> dw.writer.writerow(dw.fieldnames)
>>> dw.writerow({'foo':'oof'})
>>> f.close()
>>> open('csvtest.csv', 'rb').read()
'foo,bar,zot\r\noof,Huh?,Huh?\r\n'
>>>
dw.writerow( dict((f,f) for f in dr.fieldnames) )
.