如何使用csv.DictWriter写标题行?
假设我有一个csv.DictReader
对象,并且想将其写为CSV文件。我怎样才能做到这一点?
我知道我可以这样写 数据行 :
dr = csv.DictReader(open(f), delimiter='\t')
# process my dr object
# ...
# write out object
output = csv.DictWriter(open(f2, 'w'), delimiter='\t')
for item in dr:
output.writerow(item)
但是,如何包含字段名?
-
编辑:
在2.7 /
3.2中,有一个新writeheader()
方法。同样,John
Machin的答案提供了一种更简单的写标题行的方法。现在使用2.7 / 3.2中提供
的writeheader()
方法的简单示例:from collections import OrderedDict ordered_fieldnames = OrderedDict([('field1',None),('field2',None)]) with open(outfile,'wb') as fou: dw = csv.DictWriter(fou, delimiter='\t', fieldnames=ordered_fieldnames) dw.writeheader() # continue on to write data
实例化DictWriter需要一个fieldnames参数。
从文档中:fieldnames参数标识传递给writerow()方法的字典中的值写入csvfile的顺序。
换句话说,Fieldnames参数是必需的,因为Python字典本质上是无序的。
以下是如何将标头和数据写入文件的示例。
注意:with
声明是在2.6中添加的。如果使用2.5:from __future__ import with_statement
with open(infile,'rb') as fin: dr = csv.DictReader(fin, delimiter='\t') # dr.fieldnames contains values from first row of `f`. with open(outfile,'wb') as fou: dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames) headers = {} for n in dw.fieldnames: headers[n] = n dw.writerow(headers) for row in dr: dw.writerow(row)
正如@FM在评论中提到的,您可以将标头编写压缩为单行代码,例如:
with open(outfile,'wb') as fou: dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames) dw.writerow(dict((fn,fn) for fn in dr.fieldnames)) for row in dr: dw.writerow(row)