Pandas处理72MB JSON提取Agent_UUID、CVE及名称遇问题求助
处理JSON文件提取资产对应CVE信息的正确方案
步骤1:读取JSON文件
先通过json模块读取文件,比直接用pd.read_json更灵活,能避免嵌套结构解析问题:
import json import pandas as pd # 替换成你的JSON文件路径 with open('your_asset_data.json', 'r', encoding='utf-8') as f: raw_data = json.load(f)
步骤2:解析嵌套结构并整理数据
假设你的JSON结构是类似「顶级包含资产列表,每个资产下嵌套CVE列表」的格式(如果结构不同,替换对应的键名即可),遍历提取所需字段:
processed_rows = [] # 遍历每个资产,替换"assets"为你JSON中资产列表的实际顶级键 for asset in raw_data.get('assets', []): agent_uuid = asset.get('Agent_UUID') # 替换"vulnerabilities"为资产下CVE列表的实际键名 cve_list = asset.get('vulnerabilities', []) for cve in cve_list: processed_rows.append({ 'Agent_UUID': agent_uuid, 'CVE编号': cve.get('cve_id'), # 替换成JSON中CVE编号的实际键名 'CVE名称': cve.get('cve_name') # 替换成JSON中CVE名称的实际键名 }) # 转为DataFrame result_df = pd.DataFrame(processed_rows)
步骤3:按Agent_UUID汇总CVE信息
如果需要将同一Agent的所有CVE信息汇总到一起,用groupby实现:
# 按Agent分组,把CVE编号和名称合并为列表 summary_df = result_df.groupby('Agent_UUID').agg({ 'CVE编号': list, 'CVE名称': list }).reset_index() # 可选:转为更易读的字符串格式 summary_df['CVE详情'] = summary_df.apply( lambda x: '\n'.join([f"{id}: {name}" for id, name in zip(x['CVE编号'], x['CVE名称'])]), axis=1 ) # 查看结果 print(summary_df)
你遇到的错误解析
- TypeError:大多是
pd.json_normalize的输入格式不对(比如传了字典而非可迭代的列表),或是record_path参数指定的嵌套路径有误。 - KeyError:是代码中指定的键在JSON结构中不存在,用
dict.get()替代直接索引dict[key],能避免键不存在时报错,还能返回默认值(比如None)。
关键注意事项
- 务必把代码中的所有键名(如
assets、vulnerabilities、cve_id)替换为你JSON里的实际键名。不确定结构的话,先打印部分数据查看:print(json.dumps(raw_data['assets'][:2], indent=2))。 - 72MB的文件用这种遍历方式完全没问题,不会有内存压力。
内容的提问来源于stack exchange,提问作者LObermeyer
相关产品推荐
相关产品推荐

