如何将含嵌套数组的JSON文件批量转换为指定格式CSV?
问题:批量将嵌套JSON转换为指定格式CSV
需求说明:
- 目录
/json/reports/下有多个JSON文件,需每个文件单独转换为CSV - 现有代码会将JSON中的
line_data_list嵌套数组存入单个CSV列,需将该数组内的line、line_num、path、value、variable、entropy_validation字段拆分为独立列 - 保留原JSON中的其他字段(如
api_result、ml_result等),添加Sl.no序号列,且line_data_list列留空
原JSON结构示例(部分):
[ { "api_result": "KEY_NAME", "ml_result": "VALUE", "line_data_list": [ { "line": "54A2FF607A6dsewroadeEOERD> |-", "line_num": 9053, "path": "/home/user/src/common/race/flow/prog_flow.mk", "value": "WOERJFOQDKSDFKKASDF0", "variable": null, "entropy_validation": true } ], "ml_part": 0.994396984577179, "rule": "GCP Client ID", "severity": "high" } ]
解决方案
修改后的Python代码可实现嵌套字段拆分、序号添加及批量转换:
import pandas as pd import glob import json path = '/json/reports/*.json' files = glob.glob(path) for file in files: # 读取JSON文件内容 with open(file, 'r') as f: json_data = json.load(f) # 转换为DataFrame df = pd.DataFrame(json_data) # 拆分行数据数组:将每个line_data_list数组元素转为单独行 df_exploded = df.explode('line_data_list', ignore_index=True) # 展开嵌套字典为独立列 line_data_df = pd.json_normalize(df_exploded['line_data_list']) # 合并原数据与展开的行数据字段,移除原嵌套列 merged_df = pd.concat([df_exploded.drop('line_data_list', axis=1), line_data_df], axis=1) # 添加留空的line_data_list列 merged_df['line_data_list'] = '' # 插入Sl.no序号列(从1开始) merged_df.insert(0, 'Sl.no', range(1, len(merged_df) + 1)) # 定义期望的列顺序(确保字段排列符合要求) desired_columns = [ 'Sl.no', 'api_result', 'ml_result', 'line_data_list', 'line', 'line_num', 'path', 'value', 'variable', 'entropy_validation', 'ml_part', 'rule', 'severity' ] # 过滤出当前DataFrame中存在的列,避免报错 final_df = merged_df[[col for col in desired_columns if col in merged_df.columns]] # 保存为CSV文件,空值转为空字符串 output_file = f"{file}.csv" final_df.to_csv(output_file, index=False, na_rep='')
关键代码说明
df.explode('line_data_list'):将每个父记录的line_data_list数组拆分为多行,若一个父记录包含多个行数据项,会生成对应多行(其他字段值与父记录一致)pd.json_normalize():自动解析嵌套字典,将line、line_num等字段提取为独立列merged_df.insert(0, 'Sl.no', ...):在DataFrame最前端添加从1开始的序号列na_rep='':将JSON中的null值(如示例中的variable: null)转换为空字符串,符合CSV格式规范
内容的提问来源于stack exchange,提问作者user4948798
相关产品推荐
相关产品推荐

