Quelques options:
(1) Faites laborieusement un mappage d'identité (c'est-à-dire ne rien faire) de vos noms de champ afin que csv.DictWriter puisse le reconvertir en liste et le transmettre à une instance de csv.writer.
(2) La documentation mentionne "l' writer
instance sous-jacente " ... alors utilisez-la simplement (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 des 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ère la coder moi-même; de cette façon, vous pouvez signaler TOUS les "extras" avec les clés et les valeurs, pas seulement la première clé supplémentaire. Ce qui est vraiment gênant avec DictWriter, c'est que si vous avez vérifié vous-même les clés 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 champ est 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'
>>>
dw.writerow( dict((f,f) for f in dr.fieldnames) )
.