如何不加载完整文件移除Pandas DataFrame尾部少量坏数据?
针对大型CSV末尾坏数据的高效清理方案
你的问题核心是当前方案把所有有效数据都加载到内存再保存,导致内存溢出。既然坏数据集中在末尾且占比极小,有两个更高效的思路:
方案一:边读边写,按需停止(安全精准)
不用把所有有效数据都存在内存里,处理一个chunk就写入一个,遇到包含坏数据的chunk时,写完有效部分就直接终止,避免处理后续全是坏数据的块:
file = '/path to database' temp_file = f'{file}_temp.csv' # 先写入表头 with open(f'{file}.csv', 'r') as f_in, open(temp_file, 'w') as f_out: header = f_in.readline() f_out.write(header) # 分块读取并写入有效数据 chunk_size = 3000000 for chunk in pd.read_csv(f'{file}.csv', chunksize=chunk_size, index_col=False): valid_chunk = chunk[chunk['timestamp'] < 1.6636434764745E+018] # 追加写入有效行 valid_chunk.to_csv(temp_file, mode='a', header=False, index=False) # 如果当前chunk有无效行,说明已经到坏数据起始位置,直接停止 if len(valid_chunk) < chunk_size: break # 替换原文件 import os os.replace(temp_file, f'{file}.csv')
这个方法内存只占用单个chunk的空间,不会累积所有数据,同时能精准保留符合条件的行,即使坏数据行数有波动也没问题。
方案二:按行数直接截断(高效快速)
如果已经确定末尾10万行全是坏数据,可以直接统计总行数后截断,跳过解析每行的耗时:
import csv import os file = '/path to database' temp_file = f'{file}_temp.csv' # 统计文件总行数(含表头) total_rows = 0 with open(f'{file}.csv', 'r') as f: total_rows = sum(1 for _ in f) # 计算需要保留的行数(减去10万行坏数据) keep_rows = total_rows - 100000 # 复制前keep_rows行到临时文件 with open(f'{file}.csv', 'r') as f_in, open(temp_file, 'w') as f_out: for idx, line in enumerate(f_in): if idx < keep_rows: f_out.write(line) else: break # 替换原文件 os.replace(temp_file, f'{file}.csv')
这个方法速度最快,但依赖“末尾10万行全是坏数据”的前提,适合已经确认坏数据范围的场景。
内容的提问来源于stack exchange,提问作者Dave Smith
相关产品推荐
相关产品推荐

