Python实现JSON转多列CSV:解决赋值与列名问题
JSON转无重复多列CSV的问题排查与解决
场景还原
假设你的输入JSON示例如下:
[ {"id": "1", "user name": "Alice", "email": "alice@example.com", "role": "admin"}, {"id": "2", "user name": "None", "email": "bob@example.com", "role": "editor"}, {"id": "1", "user name": "Alice", "email": "alice@example.com", "role": "admin"}, {"id": "3", "user name": "Charlie", "email": "None", "role": "viewer"} ]
期望输出的CSV(去重、空值替换为""、包含新增列):
id,username,email,role,status 1,Alice,alice@example.com,admin,active 2,,bob@example.com,editor,active 3,Charlie,,viewer,active
问题排查与解决代码
import json import csv # 定义CSV需要包含的所有列(含新增列) CSV_COLUMNS = ["id", "username", "email", "role", "status"] def convert_json_to_csv(json_path, csv_path): # 读取JSON数据 with open(json_path, 'r', encoding='utf-8') as f: raw_data = json.load(f) # 去重逻辑:用id作为唯一键,自动覆盖重复条目 unique_entries = {} for entry in raw_data: # 处理带空格的键名:用get方法安全取值,避免KeyError raw_username = entry.get("user name", "") # 把字符串"None"转为空字符串 username = "" if raw_username == "None" else raw_username # 同理处理email字段的"None" email = "" if entry.get("email", "") == "None" else entry.get("email", "") # 构造完整行数据,包含新增列的默认值 processed_entry = { "id": entry["id"], "username": username, "email": email, "role": entry.get("role", ""), "status": "active" # 新增列示例,可根据需求修改 } unique_entries[entry["id"]] = processed_entry # 写入CSV文件 with open(csv_path, 'w', newline='', encoding='utf-8') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=CSV_COLUMNS) writer.writeheader() # 按id排序输出(可选,按需移除) for entry_id in sorted(unique_entries.keys()): writer.writerow(unique_entries[entry_id]) # 调用示例 convert_json_to_csv("input.json", "output.csv")
关键问题解决说明
含空格键名报错:
不要尝试用点语法(如entry.user name)访问带空格的键,必须用entry.get("user name", 默认值)的方式,既可以正确获取值,还能在键不存在时返回默认值,避免KeyError。"None"字符串无法转为空值:
JSON中的"None"是字符串类型,不是Python的None对象,所以必须显式判断值是否等于字符串"None",再替换为空字符串""。如果直接用if not raw_username,会把空字符串也误判,所以必须精确匹配。去重实现:
利用字典的键唯一性,以id作为键存储处理后的条目,重复的id会自动覆盖之前的条目,最后提取字典的值就是去重后的数据集。新增列处理:
在构造processed_entry时直接添加新增列的内容,可以是默认值,也可以根据其他字段计算生成,确保CSV包含所有需要的列。
内容的提问来源于stack exchange,提问作者James Black
相关产品推荐
相关产品推荐

