处理超大规模CSV文件:快速清理版本号至xx.yy.zz格式的高效方案
处理超大规模CSV中版本号格式异常的高效方案
针对500万行CSV里版本号的多余后缀问题(比如把11.0.61030.0.0.0.0截断为11.0.61030的三段格式),这里提供两种高效实现方式,兼顾内存占用和处理速度:
方案1:纯Python CSV模块(低内存首选)
适合不需要后续数据分析、只想快速清理数据的场景,逐行处理不占内存,百万级文件也能流畅运行:
import csv from io import StringIO # 实际使用时替换为 open('你的大文件.csv', 'r', newline='') input_data = StringIO("""software,version Visual C++ Minimum Runtime,11.0.61030 Visual C++ Minimum Runtime,11.0.61030 Visual C++ Minimum Runtime,11.0.61030.0.0.0.0""") # 实际使用时替换为 open('清理后文件.csv', 'w', newline='') with StringIO() as output_data: writer = csv.writer(output_data) reader = csv.reader(input_data) # 先写表头 writer.writerow(next(reader)) for row in reader: software_name, raw_version = row # 分割版本号取前3段,重新拼接 cleaned_version = '.'.join(raw_version.split('.')[:3]) writer.writerow([software_name, cleaned_version]) # 打印结果(实际运行可删除,直接写入文件即可) print(output_data.getvalue())
方案2:Pandas批量处理(适合后续数据分析)
如果还要对数据做统计、分析,用Pandas的矢量化操作比循环快得多,注意分块读取避免内存溢出:
import pandas as pd from io import StringIO input_data = StringIO("""software,version Visual C++ Minimum Runtime,11.0.61030 Visual C++ Minimum Runtime,11.0.61030 Visual C++ Minimum Runtime,11.0.61030.0.0.0.0""") # 百万级数据建议加 chunksize 参数分块处理,比如 chunksize=100000 df = pd.read_csv(input_data, dtype={'software': 'string', 'version': 'string'}) # 矢量化清理版本号:分割后取前3段再拼接 df['version'] = df['version'].str.split('.').str[:3].str.join('.') # 写入清理后的文件 df.to_csv('清理后文件.csv', index=False) # 查看处理结果 print(df)
核心优化提示
- 别一次性加载全量数据:不管用哪种方法,逐行/分块处理是处理超大规模文件的关键,能避免内存被撑爆。
- 用简单字符串操作代替正则:
split('.')[:3]的效率比正则高很多,这种简单场景完全没必要用正则。 - Pandas要指定数据类型:读取时把
software和version设为string类型,既省内存又能加快处理速度。
内容的提问来源于stack exchange,提问作者StackNewb
相关产品推荐
相关产品推荐

