有几个选项:
( 1)费力地在你的字段名外面做一个身份映射(即不做任何事)字典,以便csv.DictWriter可以将它转换回列表并将它传递给一个csv.writer实例。 (2)文档中提到了“底层的writer
实例”......所以就使用它(例子在最后)。
dw.writer.writerow(dw.fieldnames)
(3)避免csv.Dictwriter开销和自己与csv.writer
写入数据做到这一点:
w.writerow([d[k] for k in fieldnames])
或
w.writerow([d.get(k, restval) for k in fieldnames])
取而代之的extrasaction
“功能”,我宁愿自己编码;这样你就可以用键和值报告所有的“额外”,而不仅仅是第一个额外的键。DictWriter真正的麻烦在于,如果您在构建每个字典时自己验证了密钥,则需要记住使用extrasaction ='ignore',否则会慢慢地(字段名是列表)重复检查:
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还有另一种写头的方法:''dw.writerow(dict((f,f)for f in dr.fieldnames)''。 – FMc 2010-06-05 21:15:57
@亚当:对于更短的一行,请参阅我的答案。 – 2010-06-05 23:23:09
@John:+1给你的答案;简单地使用“底层写作者实例”肯定比“费力的身份映射”更可取。 – bernie 2010-06-05 23:39:25