我正在使用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
方法是在每个附加内容上创建一个空行。
答案 0 :(得分:1)
听起来,只要列发生变化,您就需要重写整个CSV文件。
如果新列附加到现有键,则当前数据行将需要附加空字段。或者,您可能有一些应该添加的默认值,而不是空字段。
因此,您需要使用RANK xxx BY a,b,c;
打开现有的CSV文件。获取DictReader
并附加新列。然后从原始文件中读取每一行,可选择使用新列的默认值更新字典。然后将其写入配置了新fieldnames
DictWriter
的新文件。最后添加新行。
fieldnames
如果字段经常变化,这将是非常低效的。相反,您可能希望在列发生更改时写入单独的CSV文件,然后在以后执行合并。