不清楚你的问题是什么,所以我将不得不猜测。如果您想要一个更具体的答案,而不是模糊的概括,您需要写一个更具体的问题。
我怀疑你有这样的代码:
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。