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; ?>
】
相关推荐
- Windows10电脑怎么设置虚拟内存_Win10
- 如何使用Golang包导出规则_控制函数和变量可见
- C#如何序列化对象为XML XmlSerializ
- phpstudy本地环境mysql忘记密码_重置m
- Win10如何更改开机密码_Windows10登录
- 如何高效删除 NumPy 二维数组中所有元素相同的
- php删除数据怎么清空表_truncate与del
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- 如何使用Golang sort排序切片_Golan
- windows 10专注助手怎么关闭_window
- 如何在Golang中处理云原生事件_使用Event
- 如何在 Go 中判断变量是否为函数类型
- Python字符串处理进阶_切片方法解析【指导】
- Win11怎么设置单手模式_Win11触控键盘布局
- Drupal 中 HTML 链接被双重转义导致渲染
- Win11怎么关闭任务栏小组件_Windows11
- PowerShell怎么创建复杂的XML结构
- Mac上的iMovie如何剪辑视频?(新手入门教程
- 如何在Golang中使用log包输出不同级别日志_
- Win10文件历史记录怎么用 Win10开启自动备
- Win11截图快捷键是什么_Win11自带截图工具
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- Win11如何设置省电模式 Win11开启电池节电
- windows 10应用商店区域怎么改_windo
- 如何减少Golang内存碎片化_Golang内存分
- c# 服务器GC和工作站GC的区别和设置
- c++怎么调用nana库开发GUI_c++ 现代风
- php485返回数据不完整怎么办_php485数据
- php文件怎么变mp4保存_php输出视频流保存为
- c++获取当前时间戳_c++ time函数使用详解
- Win11怎么打开旧版计算器_Win11恢复传统计
- Win11怎么压缩文件 Win11自带压缩解压功能
- Windows10如何重置此电脑_Windows1
- php下载安装后swoole扩展怎么安装_异步框架
- Win11怎么关闭搜索历史 Win11清除搜索框最
- Windows的便笺功能如何使用?(桌面备忘技巧)
- Go语言中正确反序列化多个同级XML元素为结构体切
- Windows如何拦截腾讯视频广告_Windows
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- Win10怎么创建桌面快捷方式 Win10为应用创
- XAMPP 启动失败(Apache 突然停止)的终
- MySQL 中使用 IF 和 CASE 实现查询字
- Win11更新后变慢怎么办_Win11系统更新后卡
- php修改数据怎么批量改状态_批量更新status
- Windows家庭版如何开启组策略(gpedit.
- 如何使用正则表达式批量替换重复的 *- 模式为固定
- C#如何使用Channel C#通道实现异步通信
- Windows10如何查看蓝屏日志_Win10使用
- Win11怎么开启游戏模式_Windows11优化
- Mac如何解压zip和rar文件?(推荐免费工具)

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