使用Python 3.x将1000+列CSV堆叠为ID与CVE两列的实现指引
多列CSV转「ID-CVE」长表实现指引
先直接回应核心疑问:
- 不存在必须使用Pandas的强制要求,两种实现路径都能完成目标转换
- 选择Pandas方案时,确实需要先将原始CSV加载为DataFrame,Pandas本身提供原生的CSV读取接口,不需要额外的前置处理步骤
- 完全可以仅使用Python内置的
csv库完成全部转换,不需要安装任何第三方依赖,适配1000+列的大文件场景
方案1:内置csv库零依赖实现
核心逻辑
原始CSV的结构规则为:第一行每个单元格对应一个唯一ID,每一列从第二行开始的所有非空单元格,都是该ID下属的CVE值。转换时只需要逐列匹配对应ID,将每一个非空CVE值和对应ID配对成一行记录输出即可。
这种逐行读写的模式不会把整个大文件一次性加载到内存,就算文件达到GB级别也不会出现内存溢出问题。
可直接运行的代码
import csv # 按实际修改为自己的文件路径 INPUT_CSV = "large_cve_source.csv" OUTPUT_CSV = "target_cve_output.csv" with open(INPUT_CSV, "r", encoding="utf-8-sig") as in_handle, \ open(OUTPUT_CSV, "w", encoding="utf-8", newline="") as out_handle: csv_reader = csv.reader(in_handle) csv_writer = csv.writer(out_handle) # 写入输出文件的表头 csv_writer.writerow(["ID", "CVE"]) # 读取第一行,获取每一列对应的ID值 col_id_map = next(csv_reader) # 逐行读取后续的CVE内容 for content_row in csv_reader: # 遍历当前行的每一列,匹配对应位置的ID for col_idx, cve_val in enumerate(content_row): # 跳过空值单元格 if cve_val.strip(): csv_writer.writerow([col_id_map[col_idx], cve_val.strip()])
方案2:Pandas实现
核心逻辑
和你之前参考的多列堆叠方案完全匹配,第一步直接通过Pandas原生接口读取原始CSV为DataFrame,不需要提前加工,直接使用melt方法将多列的值堆叠为单值列,过滤掉空值后即可得到目标结构。
可直接运行的代码
import pandas as pd # 直接读取原始CSV,低内存模式适配1000+列的大文件 df = pd.read_csv("large_cve_source.csv", low_memory=False) # 列名作为ID列,每列的CVE值作为CVE列,过滤掉空值 long_result = df.melt(var_name="ID", value_name="CVE").dropna(subset=["CVE"]) # 导出为目标CSV,不保留行索引 long_result.to_csv("target_cve_output_pandas.csv", index=False, encoding="utf-8")
选型参考
- 仅做单次格式转换、无后续数据处理需求时,优先选择内置csv库方案,零依赖、内存占用低
- 后续需要对CVE数据做筛选、聚合、统计分析时,选择Pandas方案,能大幅减少后续重复开发量
内容的提问来源于stack exchange,提问作者piggdogg
相关产品推荐
相关产品推荐

