0

0

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

舞夢輝影

舞夢輝影

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

|

575人浏览过

|

来源于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——这等于失效。此时必须手动控制缓冲区大小。

腾讯混元
腾讯混元

腾讯混元大由腾讯研发的大语言模型,具备强大的中文创作能力、逻辑推理能力,以及可靠的任务执行能力。

下载

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

def read_in_chunks(file_obj, chunk_size=8192):
    while True:
        data = file_obj.read(chunk_size)
        if not data:
            break
        yield data

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 流解析。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

709

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

625

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

736

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

616

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1235

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

573

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

695

2023.08.11

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

27

2025.12.26

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.1万人学习

Git 教程
Git 教程

共21课时 | 2.2万人学习

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

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号