如何提速百万行定长文本导入Pandas DataFrame的处理?
优化百万行定长文本转Pandas DataFrame的高效方案
针对你处理百万行定长文本耗时超20分钟的问题,核心优化思路是替换Python逐行循环的低效操作,改用Pandas底层优化的固定宽度文件读取方法,具体方案如下:
最优实现:使用pd.read_fwf直接读取
read_fwf是Pandas专门为固定宽度文本设计的读取函数,底层基于C实现IO和切片操作,效率比Python逐行循环高几个数量级,能将处理时间压缩到几分钟甚至更短。
步骤1:定义列的位置区间
根据你原代码的切片规则,整理出各列的起止位置(colspecs)和列名:
import pandas as pd # 对应原代码的切片位置,格式为(起始索引, 结束索引) colspecs = [ (0, 6), (6, 12), (12, 14), (14, 22), (22, 30), (30, 38), (38, 39), (39, 41), (41, 49), (49, 52), (52, 60), (60, 62), (62, 70), (70, 82), (82, 84), (84, 92), (92, 104), (104, 108), (108, 126), (126, 144), (144, 152), (152, 153), (153, 213) ] # 对应原代码的列名 column_names = [ 'Column1', 'Column2', 'Column3', 'Column4', 'Column5', 'Column6', 'Column7', 'Column8', 'Column9', 'Column10', 'Column11', 'Column12', 'Column13', 'Column14', 'Column15', 'Column16', 'Column17', 'Column18', 'Column19', 'Column20', 'Column21', 'Column22', 'Column23' ]
步骤2:读取文件并添加额外列
直接指定编码为cp1252,无需手动解码;最后添加原代码中的negozio列:
# 一次性读取(内存足够时优先用这个) df_total_testate = pd.read_fwf( 'temp.txt', colspecs=colspecs, names=column_names, encoding='cp1252' ) # 添加Column24(对应原代码的negozio) df_total_testate['Column24'] = negozio
内存不足时的分块处理
如果文件过大导致内存不够,用chunksize参数分块读取后合并:
chunk_size = 100000 # 每次处理10万行,可根据内存调整 chunks = [] for chunk in pd.read_fwf( 'temp.txt', colspecs=colspecs, names=column_names, encoding='cp1252', chunksize=chunk_size ): chunk['Column24'] = negozio chunks.append(chunk) # 合并所有块 df_total_testate = pd.concat(chunks, ignore_index=True)
原代码低效的原因
- Python逐行循环:Python层面的循环和切片是解释执行,远不如Pandas底层C优化的批量操作高效;
- 手动解码冗余:
read_fwf支持直接指定编码,无需手动调用decode; - 列表append的额外开销:虽然列表append amortized复杂度是O(1),但百万级别的操作仍有累计开销,不如批量读取直接生成DataFrame。
内容的提问来源于stack exchange,提问作者DonPre
相关产品推荐
相关产品推荐

