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
相关产品推荐
相关产品推荐

