讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

Python大文件读取方案_逐行与分块处理技巧【技巧】

大磊姑娘_5525

大磊姑娘_5525

发布时间:2025-12-27 23:38:02

|

595人浏览过

|

来源于php中文网

原创

大文件读取应避免readlines(),改用逐行迭代或分块读取;需指定encoding和errors处理编码异常;二进制文件用'rb'模式;linecache仅适用于随机查少数行。

python大文件读取方案_逐行与分块处理技巧【技巧】

大文件读取时内存爆掉,是因为用了 readlines()

Python 默认的 readlines() 会把整个文件加载进内存,哪怕只是想统计行数或过滤几行。1GB 的日志文件可能瞬间吃光 4GB 内存——这不是代码写错了,是调用方式不对。

真正安全的做法是让 Python 按需拉取,而不是“一口吞”。核心就两条路:逐行迭代(适合文本行结构清晰)、分块读取(适合二进制或无固定换行符的场景)。

  • for line in open(...) 是最轻量的逐行方案,底层走迭代器,内存占用≈单行长度
  • 别用 readlines() 或 read().split('\n'),它们都强制载入全部内容
  • 如果文件含超长行(比如单行几百MB的 JSON Line 变体),逐行也不安全,得切回分块

逐行处理必须加 encoding 和异常跳过

生产环境的大文件常混着编码错误(比如日志里插了二进制 dump、Windows 与 Linux 换行符交错)。不处理就会在某一行直接抛 UnicodeDecodeError 中断整个流程。

with open('access.log', 'r', encoding='utf-8', errors='ignore') as f:
    for line in f:
        if not line.strip():
            continue
        # 处理逻辑
        process_line(line)
  • errors='ignore' 跳过非法字节,errors='replace' 用 替代,按需选
  • strip() 判空比 len(line) > 0 更稳妥,能干掉纯空白行和 \r\n\r\n 类型脏数据
  • 别在循环里反复打开/关闭文件,with 块外操作会导致 ValueError: I/O operation on closed file

分块读取要用 read(size),不是 readline()

当文件没有明确换行(如 protobuf 二进制流、拼接的 gzip 块、加密 payload),readline() 会一直卡住直到遇到 \n——这等于失效。此时必须手动控制缓冲区大小。

Linuxdo Application
Linuxdo Application

为 Linux.do 注册撰写高通过率、去 AI 化的中文小作文。进行自适应调查以了解申请人的真实背景,...

下载

立即学习“Python免费学习笔记(深入)”;

def read_in_chunks(file_obj, chunk_size=8192):
    while True:
        data = file_obj.read(chunk_size)
        if not data:
            break
        yield data
<p>with open('data.bin', 'rb') as f:
for chunk in read_in_chunks(f, 65536):  # 每次读 64KB
process_chunk(chunk)
  • chunk_size 不是越大越好:32KB ~ 128KB 是多数 SSD 的友好区间;超过 1MB 容易触发 OS 缓存抖动
  • 二进制文件务必用 'rb' 模式,否则 Windows 下可能误截断 \x1A
  • 若需按记录解析(如每条 1024 字节定长),别在 chunk 边界硬切,要缓存跨块的残余字节

linecache 只适合随机查几行,千万别用来遍历

有人看到文档说 linecache.getline(filename, n) 能快速取第 n 行,就以为能用它写个 for 循环遍历——这是典型误用。它内部会为每个文件维护一个全局缓存字典,连续调用 getline 实际上把整文件又悄悄载入内存了。

  • linecache 的唯一合理场景:调试时临时查某几行,比如日志报错说 “line 1234567”,你只想看那一行
  • 它不释放缓存,多次调用不同文件会导致内存只增不减
  • 真要随机访问大文件的多行,应该先用 mmap + 扫描换行符建索引,或者转成数据库(SQLite + FTS5)

逐行和分块不是非此即彼的选择,关键看数据结构是否“可流式切割”。很多失败案例,其实卡在没意识到某类日志既不是纯文本也不是纯二进制——比如带嵌套 JSON 的混合日志,得先分块识别边界,再对每块做 JSON 流解析。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2355

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3862

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1276

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4479

2025.09.10

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2921

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

416

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

437

2026.01.06

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

512

2026.05.09

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn