批量解析500个嵌套JSON文件提取field/value并导出CSV
批量解析嵌套JSON并导出指定CSV格式方案
需求说明
- 需解析500个嵌套JSON文件,每个JSON根节点含10个键,每个键对应字典列表,每个字典包含统一键集合
- 仅提取所有字典中的
field和value键值对 - 导出CSV要求:
- 第一列为
File(存储JSON文件名) - 后续列为所有唯一的
field值 - 每个JSON文件对应CSV一行,行内填充对应
field的value
- 第一列为
JSON结构示例
{ "General info": [ { "section": "stuff", "sub-section": "stuff", "heading": "stuff", "field": "X", "value": "Y" }, { "section": "stuff", "sub-section": "stuff", "heading": "stuff", "field": "Z", "value": "W" } ], "Disclosure": [ { "section": "stuff", "sub-section": "stuff", "heading": "stuff", "field": "A", "value": "B" } ], "Insurance": [ { "section": "stuff", "sub-section": "stuff", "heading": "stuff", "field": "C", "value": "D" } ] }
目标CSV格式
| File | X | Z | A | C |
|---|---|---|---|---|
| file1 | Y | W | B | D |
| file2 | ... | ... | ... | ... |
现有代码基础
已实现遍历指定目录下所有JSON文件的逻辑:
import os import json parsed_json_dicts = [] filepath_list = [] # 遍历获取所有JSON文件 for subdir, dirs, files in os.walk('my JSON directory'): for file in files: if file.endswith('.json'): # 过滤非JSON文件 filepath = os.path.join(subdir, file) with open(filepath, 'r', encoding='utf-8') as opened_file: json_data = json.load(opened_file) parsed_json_dicts.append(json_data) filepath_list.append(filepath) print(f"共找到 {len(filepath_list)} 个JSON文件")
通用实现方案
完整代码
import os import json import pandas as pd def extract_fields_and_values(json_data): """从单个JSON数据中提取所有field-value键值对""" field_value_map = {} # 遍历根节点的所有键(如General info、Disclosure等) for key in json_data: # 遍历每个键对应的字典列表 for item in json_data[key]: field = item.get('field') value = item.get('value') if field: # 确保field存在 field_value_map[field] = value return field_value_map # 初始化存储所有数据的列表 all_data = [] # 遍历目录获取JSON文件 for subdir, dirs, files in os.walk('my JSON directory'): for file in files: if file.endswith('.json'): filepath = os.path.join(subdir, file) with open(filepath, 'r', encoding='utf-8') as f: try: json_data = json.load(f) # 提取当前文件的field-value映射 field_values = extract_fields_and_values(json_data) # 添加文件名到映射(仅保留文件名,如需完整路径直接用filepath) field_values['File'] = os.path.basename(filepath) all_data.append(field_values) except Exception as e: print(f"处理文件 {filepath} 出错: {str(e)}") # 转换为DataFrame并导出CSV if all_data: df = pd.DataFrame(all_data) # 调整列顺序,将File列放在最前面 cols = ['File'] + [col for col in df.columns if col != 'File'] df = df[cols] # 导出CSV(utf-8-sig适配Excel中文显示) df.to_csv('output.csv', index=False, encoding='utf-8-sig') print("CSV文件已成功导出为 output.csv") else: print("未找到有效JSON数据")
关键逻辑说明
extract_fields_and_values函数:遍历JSON根节点的所有键,再遍历每个键对应的字典列表,提取field和value并存储为字典(若同一field出现多次,最后一次的value会覆盖之前的,可根据需求调整去重逻辑)- 数据收集:遍历所有JSON文件,将每个文件的文件名和提取到的field-value映射存入列表
- DataFrame转换与导出:利用Pandas将列表转换为DataFrame,调整列顺序后导出为CSV,确保格式符合要求
内容的提问来源于stack exchange,提问作者SJPJack
相关产品推荐
相关产品推荐

