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

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")

关键问题解决说明

  1. 含空格键名报错:
    不要尝试用点语法(如entry.user name)访问带空格的键,必须用entry.get("user name", 默认值)的方式,既可以正确获取值,还能在键不存在时返回默认值,避免KeyError。

  2. "None"字符串无法转为空值:
    JSON中的"None"是字符串类型,不是Python的None对象,所以必须显式判断值是否等于字符串"None",再替换为空字符串""。如果直接用if not raw_username,会把空字符串也误判,所以必须精确匹配。

  3. 去重实现:
    利用字典的键唯一性,以id作为键存储处理后的条目,重复的id会自动覆盖之前的条目,最后提取字典的值就是去重后的数据集。

  4. 新增列处理:
    在构造processed_entry时直接添加新增列的内容,可以是默认值,也可以根据其他字段计算生成,确保CSV包含所有需要的列。

内容的提问来源于stack exchange,提问作者James Black

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:12:50