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
相关产品推荐
相关产品推荐

