Python文件操作优化_大文件与流处理解析【教程】
技术百科
舞夢輝影
发布时间:2026-01-01
浏览: 次 处理大文件应避免一次性读取,优先采用流式读取:按行迭代(适合文本)、分块读取(二进制或超长行)、生成器封装、内存映射(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) # 自定义处理函数
使用生成器封装流式逻辑
把文件解析逻辑封装成生成器,既能复用,又保持低内存占用:
- 生成器函数遇到
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:]
# 操作系统
# python
# app
# js
# json
# 字节
# 内存占用
# access
# csv
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11如何设置ipv6 Win11开启IPv6
- Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
- Mac如何查看电池健康百分比_Mac系统信息电源检
- Win11怎么更改系统语言_Win11中文语言包下
- Python字符串处理进阶_切片方法解析【指导】
- c++如何连接Redis c++ hiredis库
- php转mp4怎么设置帧率_调整php生成mp4视
- 如何在Golang中实现微服务负载均衡_Golan
- Python文件操作优化_大文件与流处理解析【教程
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- Python集合操作技巧_高效去重解析【教程】
- 如何使用Golang处理静态文件缓存_提高页面加载
- 如何使用Golang实现容器健康检查_监控和自动重
- 如何在Golang中处理二进制数据_Golang
- Windows怎样关闭锁屏广告_Windows关闭
- Win11怎么设置触控板手势_Windows11三
- 如何使用Golang安装依赖库_管理模块和第三方包
- c++中如何计算坐标系中两点间距离_c++勾股定理
- c# 在ASP.NET Core中管理和取消后台任
- 如何在Golang中验证模块完整性_Golangg
- php增删改查需要哪些扩展_开启mysqli或pd
- PythonDocker高级项目部署教程_多容器管
- PythonPandas数据分析项目教程_时间序列
- Win11怎么恢复出厂设置_Win11重置此电脑保
- php订单日志怎么记录评价_php记录订单评价日志
- Win11如何设置省电模式 Win11开启电池节电
- c++中如何使用虚函数实现多态_c++多态性实现原
- php串口通信波特率怎么选_根据硬件手册设置正确波
- 如何在 Laravel 中通过嵌套关联关系进行 o
- 如何用::实现工具类方法调用_php静态工具类设计
- Win11怎么更改默认打开方式_Win11关联文件
- 如何在Golang中解压文件_Golang com
- c++中的std::conjunction和std
- Win11怎么设置虚拟内存最佳大小_Windows
- 如何使用Golang实现基本类型比较_Golang
- Win11怎么关闭资讯和兴趣_Windows11任
- Win10如何更改开机密码_Windows10登录
- 如何在JavaScript中动态拼接PHP的bas
- php订单日志怎么按金额排序_php按订单金额排序
- 如何使用Golang构建简易投票统计功能_Gola
- php修改数据怎么改富文本_update更新htm
- Win11怎么关闭定位服务_保护Win11位置隐私
- Python配置文件操作教程_JSONINIYAM
- Win11怎么激活Windows10_Win11激
- Win11怎么关闭透明效果_Windows11辅助
- Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系
- Win11怎么关闭系统推荐内容_Windows11
- Win11怎么清理C盘OneDrive缓存_Win
- Win11文件夹预览图不显示怎么办_Win11缩略
- Win11开机Logo怎么换_Win11自定义启动

器封装、内存映射(mmap)随机访问。
QQ客服