应采用流式读取避免内存溢出:①按行读取适用于文本文件,用for line in f逐行处理;②分块读取适合二进制文件,用f.read(size)控制缓冲区;③用生成器封装逻辑提升复用性;④配合csv、gzip等标准库工具优化。

处理大文件时,直接用 open().read() 会把整个文件加载进内存,极易导致内存溢出。正确做法是流式读取——按需加载、边读边处理,显著降低内存占用。
按行读取:最常用且安全的方式
适用于文本文件(如日志、CSV、配置等),逐行迭代,内存只保留当前行:
- 用
for line in f:替代f.readlines(),避免一次性生成所有行的列表 - 每行末尾自带换行符
\n,需要时用line.rstrip('\n')去除 - 示例:
with open('huge.log', 'r', encoding='utf-8') as f: for line in f: if 'ERROR' in line: process_error(line)
分块读取:控制每次加载的字节数
适合二进制文件(如视频、压缩包)或需自定义处理单元的场景,通过 read(size) 精确控制缓冲区大小:
NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces
- 推荐块大小为 8192(8KB)或 65536(64KB),兼顾 I/O 效率与内存压力
- 循环调用
f.read(chunk_size),返回空字符串时表示读完 - 示例:
with open('big.zip', 'rb') as f: while True: chunk = f.read(8192) if not chunk: break process_chunk(chunk)
使用生成器封装逻辑,提升复用性
将流式读取逻辑封装为生成器函数,解耦读取与业务处理,代码更清晰、可测试:
立即学习“Python免费学习笔记(深入)”;
- 生成器用
yield逐个产出处理结果,不缓存全部数据 - 例如解析大 CSV 文件时,可 yield 每行字典而非返回列表
- 示例:
def read_csv_stream(filename): with open(filename, 'r', encoding='utf-8') as f: headers = f.readline().strip().split(',') for line in f: values = line.strip().split(',') yield dict(zip(headers, values)) for row in read_csv_stream('data.csv'): if row.get('status') == 'active': send_notification(row)
配合标准库工具进一步优化
Python 内置模块可减少手动管理负担:
-
csv.reader(f)和csv.DictReader(f)支持流式解析,无需自己切分字段 -
gzip.open()或lzma.open()可直接读取压缩文件,无需先解压到磁盘 -
itertools.islice()能高效跳过前 N 行(如跳过 CSV 表头后处理),避免冗余迭代









