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

Python实现无硬编码列值的嵌套JSON转CSV问题求助

通用嵌套JSON转CSV脚本(适配多文件结构)

核心思路

  • 递归遍历嵌套JSON,将多层级键值对扁平化为一级键(用.分隔嵌套层级,例如company.info.name)
  • 自动收集所有出现过的字段,完全避免硬编码特定字段(如company_name、company_type)
  • 仅需修改文件路径即可适配不同结构的JSON文件

完整代码

import json
import csv
from typing import Dict, List, Any

def flatten_json(nested_json: Dict[str, Any], parent_key: str = '', sep: str = '.') -> Dict[str, Any]:
    """递归扁平化嵌套JSON结构"""
    items = []
    for k, v in nested_json.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k
        if isinstance(v, dict):
            items.extend(flatten_json(v, new_key, sep=sep).items())
        elif isinstance(v, list):
            # 处理数组:若数组内是对象则递归扁平化,纯值则保留索引标记
            for i, item in enumerate(v):
                if isinstance(item, dict):
                    items.extend(flatten_json(item, f"{new_key}[{i}]", sep=sep).items())
                else:
                    items.append((f"{new_key}[{i}]", item))
        else:
            items.append((new_key, v))
    return dict(items)

def json_to_csv(json_file_path: str, csv_file_path: str):
    # 读取JSON文件
    with open(json_file_path, 'r', encoding='utf-8') as f:
        data = json.load(f)
    
    # 兼容单条数据(字典)和多条数据(数组)的情况
    if isinstance(data, dict):
        data = [data]
    elif not isinstance(data, list):
        raise ValueError("JSON数据必须是单个对象或对象数组")
    
    # 扁平化所有数据并收集全部字段
    flattened_data = [flatten_json(item) for item in data]
    all_fields = sorted(set().union(*[item.keys() for item in flattened_data]))
    
    # 写入CSV文件
    with open(csv_file_path, 'w', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=all_fields)
        writer.writeheader()
        writer.writerows(flattened_data)

# 使用示例:仅需修改以下两个路径
if __name__ == "__main__":
    INPUT_JSON_PATH = "your_input.json"
    OUTPUT_CSV_PATH = "your_output.csv"
    json_to_csv(INPUT_JSON_PATH, OUTPUT_CSV_PATH)
    print(f"转换完成,CSV已保存到 {OUTPUT_CSV_PATH}")

关键说明

  • 嵌套处理:无论JSON有多少层嵌套,flatten_json都会自动拆解,数组元素会用[索引]标记(如employees[0].position)
  • 字段自动收集:脚本会遍历所有数据,提取所有出现过的字段,无需提前定义任何字段名
  • 多文件适配:更换JSON文件时,只需要修改INPUT_JSON_PATH和OUTPUT_CSV_PATH两个变量,其余代码无需改动

常见场景适配

  • 若JSON数组内是纯值(如["北京", "上海"]),会被转为city[0]、city[1]这类字段
  • 不同文件结构差异大时,只要是合法的JSON对象/数组,脚本都能自动识别并处理所有字段
  • 原代码因嵌套层级报错的问题,递归扁平化逻辑可覆盖绝大多数嵌套场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:55:31