Edycja:
W 2.7 / 3.2 jest nowa writeheader()
metoda . Również odpowiedź Johna Machina zapewnia prostszą metodę pisania wiersza nagłówka.
Prosty przykład użycia writeheader()
metody dostępnej teraz w 2.7 / 3.2:
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
Utworzenie wystąpienia DictWriter wymaga argumentu nazwy pól.
Z dokumentacji :
Parametr fieldnames określa kolejność, w jakiej wartości ze słownika przekazane do metody writerow () są zapisywane do pliku csvfile.
Innymi słowy: argument Fieldnames jest wymagany, ponieważ dykty w Pythonie są z natury nieuporządkowane.
Poniżej znajduje się przykład, jak zapisać nagłówek i dane do pliku.
Uwaga: with
oświadczenie zostało dodane w 2.6. Jeśli używasz 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)
Jak wspomina @FM w komentarzu, możesz skondensować pisanie nagłówka do jednowierszowego tekstu, np .:
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)
. W ten sposób, jeśli zmienią się twoje pola, nie musisz dostosowywać dictWriter.Kilka opcji:
(1) Pracochłonnie wykonaj mapowanie tożsamości (tj. Nic nie rób) z nazw pól, aby csv.DictWriter mógł przekształcić je z powrotem w listę i przekazać do instancji csv.writer.
(2) Dokumentacja wspomina o „podstawowej
writer
instancji”… więc po prostu go użyj (przykład na końcu).(3) Unikaj narzutu csv.Dictwriter i zrób to sam z csv.writer
Zapisywanie danych:
lub
Zamiast
extrasaction
„funkcjonalności” wolałbym sam go zakodować; w ten sposób możesz zgłosić WSZYSTKIE „dodatki” za pomocą kluczy i wartości, a nie tylko pierwszego dodatkowego klucza. To, co jest naprawdę uciążliwe w przypadku DictWriter, polega na tym, że jeśli samodzielnie zweryfikowałeś klucze podczas budowania każdego dyktu, musisz pamiętać, aby użyć extrasaction = 'ignore', w przeciwnym razie nastąpi POWOLI (nazwy pól to lista) powtórz sprawdzanie:============
źródło
extrasaction
funkcjonalność wydaje się być zaimplementowana lepiej. To jest terazwrong_fields = rowdict.keys() - self.fieldnames so it's effectively a
ustawione.Innym sposobem na zrobienie tego byłoby dodanie przed dodaniem wierszy do wyniku, następującego wiersza:
ZIP zwróciłby listę dubletów zawierającą tę samą wartość. Ta lista może posłużyć do zainicjowania słownika.
źródło