Birkaç seçenek:
(1) Csv.DictWriter'ın onu bir listeye dönüştürebilmesi ve bir csv.writer örneğine aktarabilmesi için, zahmetli bir şekilde alan adlarınızdan bir kimlik eşlemesi yapın (yani hiçbir şey yapmayın).
(2) Dokümantasyon "temelde yatan writer
örnekten" ... bu yüzden sadece onu kullanın (sondaki örnek).
dw.writer.writerow(dw.fieldnames)
(3) csv.Dictwriter ek yükünden kaçının ve csv.writer ile kendiniz yapın
Veri yazma:
w.writerow([d[k] for k in fieldnames])
veya
w.writerow([d.get(k, restval) for k in fieldnames])
extrasaction
"İşlevsellik" yerine, kendim kodlamayı tercih ederim; bu şekilde, yalnızca ilk ekstra anahtarla değil, anahtarlar ve değerlerle birlikte TÜM "ekstraları" bildirebilirsiniz. DictWriter ile gerçek bir sıkıntı, her bir dikte oluşturulurken anahtarları kendiniz doğruladıysanız, extrasaction = 'ignore' kullanmayı hatırlamanız gerekir, aksi takdirde YAVAŞÇA (alan adları bir listedir) kontrolü tekrarlayın:
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) )
.