使用Python pandas导入百万行大TXT文件如何仅读取2021年7月后数据提速
分块读取完全适配你的需求,不会遗漏数据
分块只是将大文件拆为多个小片段逐段遍历处理,所有行都会被覆盖,只要筛选规则正确,所有2021年7月及之后的行都会被保留,不管文件后续每日新增多少数据,都能完整匹配到符合要求的全部内容。
方案1:pandas分块读取+规则筛选(无额外依赖,易实现)
import pandas as pd from datetime import datetime basepath = r'\\SERVER\folder\file.TXT' # 筛选阈值:2021年7月1日,可按需调整 cutoff_date = datetime(2021, 7, 1) # 单块读取行数,可根据你的电脑内存大小调整,内存够可以设更大 chunk_size = 100000 filtered_list = [] for chunk in pd.read_csv( basepath, sep=';', on_bad_lines='skip', # 新版pandas替换原error_bad_lines参数,老版本可保留原写法 header=None, chunksize=chunk_size ): # 此处假设日期为第0列(第一列),请替换为你实际的日期列索引 # format参数请替换为你文件中实际的日期格式,例:'%Y-%m-%d' / '%d/%m/%Y' chunk['date_col'] = pd.to_datetime(chunk[0], format='你的实际日期格式', errors='coerce') # 筛选符合要求的行 valid_chunk = chunk[chunk['date_col'] >= cutoff_date].drop(columns=['date_col']) if not valid_chunk.empty: filtered_list.append(valid_chunk) # 拼接所有符合条件的片段得到最终DataFrame df = pd.concat(filtered_list, ignore_index=True) df.head()
优化项(如果你的文件是按时间正序排列,即旧数据在前、新数据在后)
可以增加提前终止逻辑:当遍历到某一块的所有日期都大于等于筛选阈值时,后续所有块无需再做日期校验,直接全部追加即可,能进一步大幅提升读取速度。
方案2:系统级预过滤(速度更快,适合GB级超大文件)
先通过系统命令把符合条件的行筛选出来生成临时文件,再用pandas读取临时文件,处理速度远高于Python层的分块筛选。
- Windows环境示例(假设日期格式为
年-月-日,日期在每行开头):
findstr /r "^2021-0[7-9];^2021-[1-2][0-9];^202[2-9]" \\SERVER\folder\file.TXT > filtered_temp.txt
- Linux/Mac环境示例(假设日期在第一列,格式为
年-月-日):
awk -F ';' '{if (substr($1,1,7) >= "2021-07") print $0}' /path/to/file.TXT > filtered_temp.txt
筛选完成后直接读取临时文件即可:
df = pd.read_csv('filtered_temp.txt', sep=';', on_bad_lines='skip', header=None)
注意事项
- 日期解析的format参数必须和文件内的日期格式完全匹配,避免出现解析错误导致数据被误过滤;
- 可先抽取小范围数据做校验:对比分块读取和全量读取的同时间段数据行数,一致则说明筛选逻辑无误,后续新增数据只要格式不变就不会出现遗漏。
内容的提问来源于stack exchange,提问作者itskcl
相关产品推荐
相关产品推荐

