使用csv模块写入指定列到CSV时遇ValueError问题求助
解决csv.DictWriter写入时存在额外字段的报错问题
你遇到的ValueError: dict contains fields not in fieldnames错误,是因为csv.DictWriter默认会严格校验每个数据字典的键是否都在指定的fieldnames列表里,一旦发现额外字段就会抛出错误(默认参数extrasaction='raise')。这里有两种简单的解决方法:
方法一:设置extrasaction='ignore'忽略额外字段
直接在初始化DictWriter时添加extrasaction='ignore'参数,让它自动跳过不在fieldnames里的字段,无需手动处理数据:
import csv name_keys = ['DATASET ID', 'SOURCE NAME', 'NAME'] data = [ { "DATASET ID":112313, "SOURCE NAME":"source 1", "NAME":"0", "TYPE":1, "Random":1 }, { "DATASET ID":112315, "SOURCE NAME":"source 2", "NAME":"1", "TYPE":1, "Random":1 }] file_path = "output.csv" # 替换成你的目标文件路径 with open(file_path, 'w', encoding='UTF8', newline='') as f: writer = csv.DictWriter(f, fieldnames=name_keys, extrasaction='ignore') writer.writeheader() # 用专门的writeheader()写入表头,比手动writerow更规范 writer.writerows(data)
方法二:手动过滤每个字典的字段
如果需要对数据做预处理(比如字段值格式调整),可以手动遍历每个数据字典,只保留name_keys中的字段:
import csv name_keys = ['DATASET ID', 'SOURCE NAME', 'NAME'] data = [ { "DATASET ID":112313, "SOURCE NAME":"source 1", "NAME":"0", "TYPE":1, "Random":1 }, { "DATASET ID":112315, "SOURCE NAME":"source 2", "NAME":"1", "TYPE":1, "Random":1 }] file_path = "output.csv" # 替换成你的目标文件路径 # 生成仅包含指定字段的新数据列表 filtered_data = [{key: item[key] for key in name_keys} for item in data] with open(file_path, 'w', encoding='UTF8', newline='') as f: writer = csv.DictWriter(f, fieldnames=name_keys) writer.writeheader() writer.writerows(filtered_data)
这种方法完全规避了额外字段的干扰,适合需要精细控制数据内容的场景。
内容的提问来源于stack exchange,提问作者tousif Noor
相关产品推荐
相关产品推荐

