如何使用csv.DictWriter写标题行?

发布于 2021-01-29 18:20:59

假设我有一个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)

但是,如何包含字段名?

关注者
0
被浏览
167
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    编辑:
    在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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看