Python实现含缺失字段与嵌套结构的JSON转CSV解决方法
解决JSON Lines转CSV(字段不统一+嵌套属性)的Python方案
核心思路
要搞定这个问题,需要处理两个核心点:
- 把嵌套的JSON结构扁平化,转成单层键值对
- 收集所有可能出现的字段作为CSV表头,缺失字段自动留空
完整实现代码
import json import csv from typing import Dict, Any def flatten_json(obj: Dict[str, Any], parent_key: str = '', sep: str = '.') -> Dict[str, Any]: """递归扁平化嵌套JSON,用.连接嵌套键""" items = [] for k, v in obj.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()) else: # 处理示例里的JSON语法错误("true,"多了逗号),实际合法JSON可删除此判断 if isinstance(v, str): v = v.rstrip(',') items.append((new_key, v)) return dict(items) # 配置文件路径 input_json_path = "your_input.json" output_csv_path = "your_output.csv" all_flattened_data = [] all_fields = set() # 第一步:读取所有JSON行,扁平化并收集所有字段 with open(input_json_path, 'r', encoding='utf-8') as f: for line_num, line in enumerate(f, 1): line = line.strip() if not line: continue try: json_obj = json.loads(line) except json.JSONDecodeError: # 临时修复示例中的语法错误,实际使用时可根据情况调整或抛出错误 fixed_line = line.replace('"true,"', '"true"') json_obj = json.loads(fixed_line) flattened_data = flatten_json(json_obj) all_flattened_data.append(flattened_data) all_fields.update(flattened_data.keys()) # 对字段排序,让表头更规整(可选) sorted_fields = sorted(all_fields) # 第二步:写入CSV文件 with open(output_csv_path, 'w', newline='', encoding='utf-8') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=sorted_fields) writer.writeheader() for row in all_flattened_data: writer.writerow(row)
关键细节说明
- 扁平化处理:通过递归函数将嵌套的JSON展开,比如
{"hi":{"a":"true"}}会被转成{"hi.a": "true"},避免字段名冲突。 - 字段收集:用集合存储所有出现过的字段,自动去重,确保CSV表头包含所有可能的字段。
- 缺失字段处理:
csv.DictWriter会自动为缺失字段填充空值,无需手动处理。 - 语法错误兼容:针对你提供的示例中第三行的JSON语法错误(
"true,"多了逗号),代码做了临时修复,实际使用时如果JSON格式合法,可以删除这部分容错逻辑。
内容的提问来源于stack exchange,提问作者user21234626
相关产品推荐
相关产品推荐

