You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提速百万行定长文本导入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)

原代码低效的原因

  1. Python逐行循环:Python层面的循环和切片是解释执行,远不如Pandas底层C优化的批量操作高效;
  2. 手动解码冗余:read_fwf支持直接指定编码,无需手动调用decode;
  3. 列表append的额外开销:虽然列表append amortized复杂度是O(1),但百万级别的操作仍有累计开销,不如批量读取直接生成DataFrame。

内容的提问来源于stack exchange,提问作者DonPre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:00:38