处理大文件应避免一次性读取,优先采用流式读取:按行迭代(适合文本)、分块读取(二进制或超长行)、生成器封装、内存映射(mmap)随机访问。

处理大文件时,直接用 open().read() 容易内存爆炸。核心思路是:不一次性加载全部内容,改用流式读取、分块处理、按需解析。
按行迭代读取(适合文本日志、CSV等)
对逐行处理的场景(如过滤日志、统计关键词),用 for 循环遍历文件对象最省内存:
- Python 文件对象本身是可迭代的,每次只读一行,不缓存整文件
- 避免
readlines()—— 它会把所有行载入内存,即使你只想要前10行 - 示例:
with open('access.log') as f:
for line in f: # 每次只加载当前行
if 'ERROR' in line:
print(line.strip())
分块读取二进制或超长行文件
当文件含超长行(如单行 JSON、DNA 序列)或纯二进制数据(如视频片段提取),需手动控制缓冲区大小:
- 用
f.read(chunk_size)按固定字节数读取,比如 8192 字节(8KB)是常见平衡点 - 注意:文本模式下按字节读可能截断 UTF-8 字符,优先用行迭代;若必须分块,建议用二进制模式 + 手动解码
- 示例:
with open('data.bin', 'rb') as f:
while True:
chunk = f.read(4096)
if not chunk:
break
process_chunk(chunk) # 自定义处理函数
使用生成器封装流式逻辑
把文件解析逻辑封装成生成器,既能复用,又保持低内存占用:
10分钟内自己学会PHP其中,第1篇为入门篇,主要包括了解PHP、PHP开发环境搭建、PHP开发基础、PHP流程控制语句、函数、字符串操作、正则表达式、PHP数组、PHP与Web页面交互、日期和时间等内容;第2篇为提高篇,主要包括MySQL数据库设计、PHP操作MySQL数据库、Cookie和Session、图形图像处理技术、文件和目录处理技术、面向对象、PDO数据库抽象层、程序调试与错误处理、A
立即学习“Python免费学习笔记(深入)”;
- 生成器函数遇到
yield就暂停并返回一个值,下次调用再从断点继续 - 适合“读一块 → 解析一批 → 返回结果”的流水线场景
- 示例(逐块解析 CSV 块):
def csv_chunk_reader(filepath, chunk_size=1000):
with open(filepath, encoding='utf-8') as f:
reader = csv.reader(f)
buffer = []
for row in reader:
buffer.append(row)
if len(buffer) >= chunk_size:
yield buffer
buffer = []
if buffer:
yield buffer
内存映射(mmap)处理超大只读文件
当需要随机访问大文件某几处(如查找偏移量、校验哈希),mmap 比传统读取更高效:
-
mmap把文件“映射”到内存地址空间,操作系统按需加载页,不占实际 RAM - 仅适用于只读或简单写入;不能用于网络文件或不支持 mmap 的文件系统
- 示例:
import mmap
with open('huge.bin', 'rb') as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mm:
# 直接切片访问,像操作 bytes 一样
header = mm[:16]
checksum = mm[-32:]









