Python将字典动态值写入CSV 解决循环写入重复表头问题
重复写入表头的原因
你当前的写入逻辑放在while True循环内,每次循环都会以追加模式打开文件并执行writeheader()方法写入表头,因此每写入一批数据都会先插入一次表头,最终出现重复表头的问题。
另外注意你的字段名变量名需要保持一致,示例中定义的是field_name,代码中用的是field_names,需要修正避免报错。
解决方案
方案1:每次写入前判断文件状态,按需写表头
适配边生成数据边追加写入的场景,每次写入前先判断文件是否存在、是否为空,仅当文件不存在/为空时写入表头:
import csv import os field_names = ["Name","Age","Place"] while True: # 此处保留你生成dictionary的原有逻辑 dictionary = [{ "Name": f"{name_of_the_person}", "Age": f"{age_of_the_person}", "Place": f"{place_name}" }] file_path = "csv_can.csv" # 判断文件状态 file_exists = os.path.exists(file_path) file_is_empty = file_exists and os.path.getsize(file_path) == 0 with open(file_path, "a", newline="", encoding="utf-8") as f: writ = csv.DictWriter(f, fieldnames=field_names) # 仅首次写入时写表头 if not file_exists or file_is_empty: writ.writeheader() writ.writerows(dictionary) # 此处保留你原有循环的退出逻辑、休眠逻辑
方案2:表头逻辑移到循环外,仅执行一次
如果程序启动时确定需要新建文件/清空原有文件,直接把写表头的逻辑放在循环开始前执行一次即可,循环内仅写数据,运行效率更高:
import csv field_names = ["Name","Age","Place"] file_path = "csv_can.csv" # 循环开始前仅执行一次表头写入 with open(file_path, "w", newline="", encoding="utf-8") as f: writ = csv.DictWriter(f, fieldnames=field_names) writ.writeheader() while True: # 此处保留你生成dictionary的原有逻辑 dictionary = [{ "Name": f"{name_of_the_person}", "Age": f"{age_of_the_person}", "Place": f"{place_name}" }] # 循环内仅追加写入数据 with open(file_path, "a", newline="", encoding="utf-8") as f: writ = csv.DictWriter(f, fieldnames=field_names) writ.writerows(dictionary) # 此处保留你原有循环的退出逻辑、休眠逻辑
如果需要保留历史文件内容,不要用w模式初始化文件,复用方案1的文件存在判断逻辑放在循环外执行一次即可。
内容的提问来源于stack exchange,提问作者sreevalsan
相关产品推荐
相关产品推荐

