说我有两个字典
dict1 = {'name':'Leo','age':'15','tel':'123456789'}
dict2 = {'name':'Zac','age':'20','tel':'987654321'}
我想将这两个dicts写入csv文件。我可以将一个dict写入一个csv文件,其头部位于表的顶部,但是当我将第二个dict添加到同一个csv文件时,它会在最后一次输入后写入另一个头。所以我想知道是否有办法检查标头是否已经存在,如果没有,添加标头,否则只需添加新的字典数据
答案 0 :(得分:2)
目前还不清楚你的问题是什么,所以我不得不猜测。如果你想要一个更具体的答案,而不是模糊的一般性,你需要写一个更具体的问题。
我怀疑你有这样的代码:
with open('output.csv', 'w') as f:
dw = csv.DictWriter(f, ('name', 'age', 'tel'))
dw.writeheader()
dw.writerow(dict1)
with open('output.csv', 'a') as f:
dw = csv.DictWriter(f, ('name', 'age', 'tel'))
dw.writeheader()
dw.writerow(dict2)
问题是您的输出如下所示:
name,age,tel
Leo,15,123456789
name,age,tel
Zac,20,987654321
如果你想要这个:
name,age,tel
Leo,15,123456789
Zac,20,987654321
如果是这样,解决此问题的正确方法是不要再次呼叫writeheader
。根据代码的结构,这可能就像不在某处调用它一样简单。
但是,假设你有一些包装函数,就像这样:
def add_to_csv(row):
with open('output.csv', 'a') as f:
dw = csv.DictWriter(f, ('name', 'age', 'tel'))
dw.writeheader()
dw.writerow(row)
并且您无法更改它,并且只有在文件为空时才希望它写入标题。
有几种不同的方法可以判断文件是否为空。如果您在'a'
模式下打开文件,那么一次轻松就是检查f.tell()
是否为非零。或者您可以检查os.fstat(f.fileno()).st_size
是否为非零。
但如果你在程序的一次运行中进行所有写操作,那么在脚本中跟踪就可能更清晰。同样,您可以将open
和DictWriter
代码移出到实例/全局级别,而不是函数/方法的本地代码。或者,您可以添加实例/全局标记,以跟踪您是否已调用writeheader
。
答案 1 :(得分:0)
确定
headers_that_do_not_exist = set(dict2.keys()) - set(dict1.keys())