如何将4列CSV转换为指定结构JSON并解决KeyError: 'C'报错
问题修复方案
错误原因
KeyError: 'C'是因为csv.DictReader读取到的CSV表头字段中不存在名为C的键,常见触发场景有两个:
- CSV表头的
C列名前后带有多余的空格,实际读取到的键名是带空格的' C '而非'C' - 你样例中标记的A、B、C、D是自己标注的列序号,实际CSV文件没有这行表头,第一行直接就是数据内容,
csv.DictReader默认把第一行数据当成了表头,自然找不到C这个键
同时你原代码还有一个逻辑错误:你把整行数据赋值给了字典值,不符合你需要的C列内容为键、B列翻译文本为值的要求。
修复代码
场景1:CSV第一行确实是A、B、C、D作为表头
先对读取到的字段名做空格清洗,同时修正取值逻辑:
import csv import json def make_json(csvFilePath, jsonFilePath): data = {} with open(csvFilePath, encoding='utf-8') as csvf: csvReader = csv.DictReader(csvf) # 清洗所有表头字段的前后空格,避免隐形空格导致取值失败 csvReader.fieldnames = [field.strip() for field in csvReader.fieldnames] for row in csvReader: key = row["C"].strip() # 仅取B列的翻译文本作为值 data[key] = row["B"].strip() with open(jsonFilePath, 'w', encoding='utf-8') as jsonf: # 加ensure_ascii=False避免中文被转义为Unicode编码 json.dump(data, jsonf, indent=4, ensure_ascii=False) csvFilePath = "main.csv" jsonFilePath = "test.json" make_json(csvFilePath, jsonFilePath)
场景2:CSV没有A、B、C、D的表头,第一行就是数据
手动指定字段名即可:
import csv import json def make_json(csvFilePath, jsonFilePath): data = {} # 手动指定四列对应的字段名 field_names = ["A", "B", "C", "D"] with open(csvFilePath, encoding='utf-8') as csvf: # 传入自定义字段名,DictReader会把所有行都当成数据处理 csvReader = csv.DictReader(csvf, fieldnames=field_names) for row in csvReader: key = row["C"].strip() data[key] = row["B"].strip() with open(jsonFilePath, 'w', encoding='utf-8') as jsonf: json.dump(data, jsonf, indent=4, ensure_ascii=False) csvFilePath = "main.csv" jsonFilePath = "test.json" make_json(csvFilePath, jsonFilePath)
验证方法
如果不确定自己的CSV表头内容,可以在创建csvReader后加一行print(csvReader.fieldnames)运行,就能看到实际读取到的所有表头字段,匹配键名即可。
内容的提问来源于stack exchange,提问作者PstasDev
相关产品推荐
相关产品推荐

