如何使用Pandas将嵌套JSON转为CSV并展开CVE_Items列
解决NVD JSON转CSV时展开CVE_Items列的问题
嘿,我懂你现在的困扰——直接用pd.read_json读取NVD的CVE JSON文件后,CVE_Items列还是嵌套的JSON结构,没法在CSV里看到里面的详细字段对吧?这是因为NVD的JSON是多层嵌套结构,最外层的CVE_Items是包含多个对象的数组,默认的read_json只会解析最外层键为列,内层嵌套结构会被保留成Python对象。
下面是具体的解决步骤,直接就能用:
方法一:直接解析并展开CVE_Items
先读取整个JSON数据,再用json_normalize展开嵌套的CVE_Items数组:
import pandas as pd from pandas import json_normalize # 读取JSON文件 with open('nvdcve-1.0-modified.json', 'r') as f: nvd_json = pd.read_json(f) # 提取CVE_Items数组并展开所有嵌套字段 expanded_df = json_normalize(nvd_json['CVE_Items']) # 保存为CSV(去掉index避免生成多余索引列) expanded_df.to_csv("test.csv", index=False)
方法二:基于你已有的代码修改
如果已经运行过初始读取代码,也可以在原DataFrame基础上展开CVE_Items:
import pandas as pd from pandas import json_normalize # 你的原有代码 df = pd.read_json('nvdcve-1.0-modified.json') # 展开CVE_Items列 cve_items_expanded = json_normalize(df['CVE_Items'].tolist()) # 合并原DataFrame的其他字段(如CVE_data_timestamp、CVE_data_numberOfCVEs等)和展开后的字段 final_df = pd.concat([df.drop('CVE_Items', axis=1), cve_items_expanded], axis=1) # 保存结果 final_df.to_csv("test.csv", index=False)
小提示
- 展开后的列名会用
.表示嵌套层级,比如cve.data_type、cve.description.description_data,能清晰体现字段的原始嵌套关系。 - 如果只需要特定嵌套字段,可以在
json_normalize里指定record_path和meta参数筛选,比如只展开cve和impact下的字段,减少输出CSV的列数,提升处理速度。
内容的提问来源于stack exchange,提问作者user9551424
相关产品推荐
相关产品推荐

