说我有两个字典
dict1 = {'name':'Leo','age':'15','tel':'123456789'}
dict2 = {'name':'Zac','age':'20','tel':'987654321'}
Run Code Online (Sandbox Code Playgroud)
我想将这两个字典写入一个 csv 文件。我可以将一个 dict 写入一个标题位于表格顶部的 csv 文件,但是当我将第二个 dict 添加到同一个 csv 文件时,它会在最后一次输入后写入另一个标题。所以我想知道是否有办法检查标题是否已经存在,如果不存在,则添加标题,否则只需添加新的字典数据
不清楚你的问题是什么,所以我将不得不猜测。如果你想要一个更具体的答案,而不是模糊的概括,你需要写一个更具体的问题。
我怀疑你有一些这样的代码:
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)
Run Code Online (Sandbox Code Playgroud)
问题是您的输出如下所示:
name,age,tel
Leo,15,123456789
name,age,tel
Zac,20,987654321
Run Code Online (Sandbox Code Playgroud)
当你想要这个时:
name,age,tel
Leo,15,123456789
Zac,20,987654321
Run Code Online (Sandbox Code Playgroud)
如果是这样,解决这个问题的正确方法就是不要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)
Run Code Online (Sandbox Code Playgroud)
而且您无法更改它,并且您希望它仅在文件为空时才写入标头。
有几种不同的方法可以判断文件是否为空。考虑到您已在'a'模式下打开文件,一个简单的方法就是检查它f.tell()是否为非零。或者您可以检查它os.fstat(f.fileno()).st_size是否为非零。
但是,如果您在一次程序运行中完成所有写入操作,那么在脚本中进行跟踪可能会更清晰。同样,您可以将open和DictWriter代码移出到实例/全局级别,而不是函数/方法的本地级别。或者您可以添加一个实例/全局标志来跟踪您是否已调用writeheader。