algunas opciones:
(1) Laboriosamente haga una asignación de identidad (es decir, no haga nada) dict fuera de sus nombres de campo para que csv.DictWriter pueda convertirlo de nuevo a una lista y pasarlo a una instancia de csv.writer.
(2) La documentación menciona "la instancia subyacente writer
" ... así que solo úsala (ejemplo al final).
dw.writer.writerow(dw.fieldnames)
(3) Evitar la sobrecarga csv.Dictwriter y hacerlo tu mismo con csv.writer
escritura de datos:
w.writerow([d[k] for k in fieldnames])
o
w.writerow([d.get(k, restval) for k in fieldnames])
En lugar de la extrasaction
"funcionalidad", preferiría codificarlo yo mismo; de esa manera puede reportar TODOS los "extras" con las claves y valores, no solo con la primera clave adicional.Lo que es realmente una molestia con DictWriter es que si ha verificado las claves usted mismo cuando se está construyendo cada dict, debe recordar usar extrasaction = 'ignore'; de lo contrario, se va a LENTAMENTE (los nombres de los campos es una lista) repite el cheque:
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'
>>>
+1 Otra forma más de escribir el encabezado: 'dw.writerow (dict ((f, f) para f en dr.fieldnames))'. – FMc
@ Adam: para un one-liner más corto, vea mi respuesta. –
@John: +1 a su respuesta; simplemente utilizar "la instancia de escritor subyacente" es ciertamente preferible a "mapeo de identidad laborioso". – bernie