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

Python按块读取大文件行:寻求替代readline()的高效方案

高效按块读取大文件的方案

针对你这种50万行、10万列的大文件,按每50行一块处理的需求,推荐以下两种低内存占用的高效方案,完全不需要重置文件指针:

方案一:逐行迭代+批量收集

直接利用文件对象的可迭代特性,逐行收集到指定块大小后处理,内存仅保留当前块的50行数据:

def process_block(block):
    # 这里替换成你的块处理逻辑,比如数据分析、计算等
    print(f"处理了{len(block)}行数据")

block_size = 50
with open('your_large_file.txt', 'r') as f:
    current_block = []
    for line in f:
        # 根据你的数据格式处理每行,比如按分隔符拆分列
        processed_line = line.strip().split('\t')  # 假设是制表符分隔,按需替换
        current_block.append(processed_line)
        if len(current_block) == block_size:
            process_block(current_block)
            current_block = []  # 清空块,准备下一组
    # 处理文件末尾不足50行的剩余数据
    if current_block:
        process_block(current_block)

方案二:用itertools.islice按块读取

借助itertools.islice直接从文件迭代器中截取指定行数的块,代码更简洁:

from itertools import islice

def process_block(block):
    # 替换为你的处理逻辑
    print(f"处理了{len(block)}行数据")

block_size = 50
with open('your_large_file.txt', 'r') as f:
    while True:
        # 从当前文件位置截取50行
        block_lines = list(islice(f, block_size))
        if not block_lines:
            break  # 没有数据了,退出循环
        # 处理每行数据,再传入处理函数
        processed_block = [line.strip().split('\t') for line in block_lines]
        process_block(processed_block)

关键说明

  • 这两种方案都是单次打开文件,顺序迭代读取,完全不需要回到文件开头,从根源解决了你之前指针到末尾无法继续的问题。
  • 内存占用极低:仅保存当前正在处理的50行数据,不会加载整个文件到内存,完美适配你的大数据集。
  • 如果你的数据是标准CSV格式,可以用csv.reader替代split(),处理带引号、转义符的字段更稳定,效率也更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:29:57