使用'a'方法写入csv:标题和新值

时间:2016-02-10 12:22:25

标签: python csv dictionary

我正在使用append方法'a'打开一个csv文件,使用DictWriter作为每次调用函数的结果写一个新行(每次调用只写一个新行)

keys = ['15000', '15001', '15002', '15003']

values = [18, 20, 3, 9] ##changes each time function run

每次我对函数感兴趣时,值都会改变。密钥通常保持不变,但是当我从XML文件中抓取时,将来可能会添加更多密钥(关联新值)。因此,我希望能够将值一致地映射到字段名。

with open('myfile.csv', 'a') as csvfile:
    w = csv.DictWriter(csvfile, fieldnames = keys, lineterminator='\n')
    w.writerheader()
    w.writerow(dict(zip(fnames, values)))

这里的问题是每次writerheader()在前一行下写标题。结果csv看起来像:

15000, 15001, 15002, 15003  
18, 20, 3, 9   
15000, 15001, 15002, 15003  
20, 15, 4, 12

我希望这不要重复标题。我知道我可以从只有初始键作为标题的csv开始,但如果字典键在将来的函数调用中发生变化,这并不能解决我的问题。此外,如果添加新密钥,这是否会始终将值映射到密钥?我会遇到问题吗?

P.S。请注意,我添加了lineterminated = '\n' para,因为默认的DictWriter方法是在每个附加内容上创建一个空行。

1 个答案:

答案 0 :(得分:1)

听起来,只要列发生变化,您就需要重写整个CSV文件。

如果新列附加到现有键,则当前数据行将需要附加空字段。或者,您可能有一些应该添加的默认值,而不是空字段。

因此,您需要使用RANK xxx BY a,b,c;打开现有的CSV文件。获取DictReader并附加新列。然后从原始文件中读取每一行,可选择使用新列的默认值更新字典。然后将其写入配置了新fieldnames DictWriter的新文件。最后添加新行。

fieldnames

如果字段经常变化,这将是非常低效的。相反,您可能希望在列发生更改时写入单独的CSV文件,然后在以后执行合并。