You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:27:03