Quelques options :
(1) Faire laborieusement un dict de mappage d'identité (i.e. ne rien faire) à partir de vos noms de champs pour que csv.DictWriter puisse le reconvertir en liste et le passer à une instance de csv.writer.
(2) La documentation mentionne "le sous-jacent writer
instance" ... il suffit donc de l'utiliser (exemple à la fin).
dw.writer.writerow(dw.fieldnames)
(3) Évitez la surcharge de csv.Dictwriter et faites-le vous-même avec csv.writer.
Écriture de données :
w.writerow([d[k] for k in fieldnames])
ou
w.writerow([d.get(k, restval) for k in fieldnames])
Au lieu de la extrasaction
"fonctionnalité", je préférerais la coder moi-même ; de cette façon, vous pouvez signaler TOUS les "extras" avec les clés et les valeurs, et pas seulement la première clé supplémentaire. Ce qui est vraiment ennuyeux avec DictWriter, c'est que si vous avez vérifié les clés vous-même lors de la construction de chaque dict, vous devez vous rappeler d'utiliser extrasaction='ignore' sinon il va répéter LENTEMENT (les noms de champs sont une liste) la vérification :
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'
>>>