Bearbeiten:
In 2.7 / 3.2 gibt es eine neue writeheader()
Methode . Die Antwort von John Machin bietet auch eine einfachere Methode zum Schreiben der Kopfzeile.
Einfaches Beispiel für die Verwendung der writeheader()
jetzt in 2.7 / 3.2 verfügbaren Methode:
from collections import OrderedDict
ordered_fieldnames = OrderedDict([('field1',None),('field2',None)])
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=ordered_fieldnames)
dw.writeheader()
# continue on to write data
Das Instanziieren von DictWriter erfordert ein Argument für Feldnamen.
Aus der Dokumentation :
Der Parameter fieldnames gibt die Reihenfolge an, in der Werte im Wörterbuch, die an die writerow () -Methode übergeben werden, in die csv-Datei geschrieben werden.
Anders ausgedrückt: Das Argument Feldnamen ist erforderlich, da Python-Dikte von Natur aus ungeordnet sind.
Unten finden Sie ein Beispiel dafür, wie Sie den Header und die Daten in eine Datei schreiben.
Hinweis: Die with
Anweisung wurde in 2.6 hinzugefügt. Bei Verwendung von 2.5:from __future__ import with_statement
with open(infile,'rb') as fin:
dr = csv.DictReader(fin, delimiter='\t')
# dr.fieldnames contains values from first row of `f`.
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
headers = {}
for n in dw.fieldnames:
headers[n] = n
dw.writerow(headers)
for row in dr:
dw.writerow(row)
Wie @FM in einem Kommentar erwähnt, können Sie das Schreiben von Headern auf einen Einzeiler komprimieren, z.
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
dw.writerow(dict((fn,fn) for fn in dr.fieldnames))
for row in dr:
dw.writerow(row)
dw.writerow( dict((f,f) for f in dr.fieldnames) )
.dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
. Auf diese Weise müssen Sie den dictWriter nicht anpassen, wenn sich Ihre Felder ändern.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).(3) Vermeiden Sie den Aufwand für csv.Dictwriter und machen Sie es selbst mit csv.writer
Daten schreiben:
oder
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:============
quelle
extrasaction
scheint die Funktionalität in Python 3.6 besser implementiert zu sein. Es ist jetztwrong_fields = rowdict.keys() - self.fieldnames so it's effectively a
eingestellt.Eine andere Möglichkeit, dies zu tun, besteht darin, vor dem Hinzufügen von Zeilen in Ihrer Ausgabe die folgende Zeile hinzuzufügen:
Die Zip würde eine Liste von Dubletten zurückgeben, die denselben Wert enthalten. Diese Liste kann verwendet werden, um ein Wörterbuch zu initiieren.
quelle