python读取大文件应采用流式读取避免内存溢出:逐行读取适用于文本文件,用for line in f;按字节块读取适合二进制文件,用f.read(size);读取指定行范围可用itertools.islice;结构化数据推荐csv模块流式解析。

Python读取大文件不能一次性用read()或readlines()加载全部内容,否则容易内存溢出。核心思路是“流式读取”——按需分块读,边读边处理,保持内存占用稳定。
逐行读取(最常用)
适用于文本文件,尤其是日志、CSV、配置等按行组织的数据。Python的文件对象本身支持迭代,内存友好且代码简洁:
- 直接用
for line in f:,每轮只加载一行到内存 - 自动处理换行符,无需手动
strip()(但空行和末尾换行仍需注意) - 避免
f.readlines(),它会把所有行存成列表,失去流式优势
示例:
with open('huge.log', 'r', encoding='utf-8') as f:
for line in f:
if 'ERROR' in line:
print(line.rstrip()) # rstrip() 去掉换行符
按字节块读取(更底层、更灵活)
适合二进制文件(如视频、压缩包),或需要精细控制读取粒度的场景。用f.read(size)每次读固定字节数:
立即学习“Python免费学习笔记(深入)”;
-
size建议设为 8192 或 65536(即 8KB 或 64KB),兼顾效率与内存 - 返回字符串(文本模式)或
bytes(二进制模式),读完返回空字符串/空bytes - 需自行处理数据边界(比如一行被切在两块中),文本处理慎用
示例(读取大文本并统计字符数):
count = 0
with open('big.txt', 'r', encoding='utf-8') as f:
while True:
chunk = f.read(8192)
if not chunk:
break
count += len(chunk)
print(f"总字符数:{count}")
使用itertools.islice读取指定行范围
当只需处理文件中间某一段(如第10000–10100行),不希望从头遍历时:
- 配合
islice(f, start, stop)跳过前start行,只取后续若干行 - 仍属流式——不加载无关行,内存无压力
- 适合分页分析、抽样调试
示例(读取第5001–5010行):
from itertools import islice
<p>with open('data.csv', 'r', encoding='utf-8') as f:
for line in islice(f, 5000, 5010): # 注意:起始索引从0算,5000=第5001行
print(line.rstrip())
处理超大CSV或结构化数据
纯Python逐行split()易出错(如字段含逗号、换行)。推荐用csv模块流式解析:
-
csv.reader(f)或csv.DictReader(f)都支持文件对象迭代 - 内部按行解析,自动处理引号、转义,安全可靠
- 结合
islice或条件判断,可边读边过滤、聚合
示例(读取CSV中销售额>10000的记录):
import csv
<p>with open('sales.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
if float(row.get('amount', 0)) > 10000:
print(row)
流式读取不是技巧堆砌,而是根据数据形态选对方式:文本优先逐行,二进制控块大小,结构化用专用模块,定位片段用切片。关键是让内存占用与文件大小脱钩。










