讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Python中利用gzip模块压缩与解压流数据

秋婷吖_8798

秋婷吖_8798

发布时间:2026-10-05 10:25:49

|

440人浏览过

|

来源于php中文网

原创

gzip.compress()和gzip.decompress()适用于小数据内存压缩,因需一次性加载全部数据,处理大文件易致OOM;仅支持bytes类型输入,compresslevel参数范围为0–9(默认6)。

如何在python中利用gzip模块压缩与解压流数据

gzip.compress() 和 gzip.decompress() 适合小数据流,但别直接喂大文件

这两个函数最常用,但它们要求整个输入必须能一次性装进内存。比如你用 gzip.compress(b"hello world") 没问题,但若想压缩一个 2GB 的日志流,用它就会 OOM。

常见错误现象:MemoryError 或进程被系统 kill;实际场景中多见于读取网络响应体、数据库 BLOB 字段或临时生成的大量 JSON 后立即压缩。

  • 只对 bytes 类型输入有效,传 str 会报 TypeError: a bytes-like object is required
  • 压缩级别用 compresslevel=9(默认是 6),但 >9 无效,ValueError
  • 它们不处理文件头校验和(如 CRC32),也不写 gzip 文件格式元信息——纯压缩/解压字节流,不是生成 .gz 文件

用 gzip.GzipFile 处理任意长度的流,关键在 mode 和 fileobj

真正做流式压缩/解压得靠 GzipFile,但它不直接操作路径,而是依赖已打开的可读/可写类文件对象(file-like object)。很多人卡在这一步:误以为它能自动打开文件,其实不能。

典型使用场景:从 requests.Response.raw 读响应流并实时解压;把 io.BytesIO 当作中间缓冲区做管道式处理。

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

Li Python Sec Check
Li Python Sec Check

Python 安全规范检查工具:基于 CloudBase 规范、腾讯安全指南,LLM 智能分析(默认禁用,优先本地执行)

下载
  • 压缩流:创建 GzipFile(mode="w", fileobj=buffer),然后 .write() 多次,最后 .close() —— 不 close 就丢数据
  • 解压流:用 GzipFile(mode="r", fileobj=buffer),再调 .read() 或循环 .read(8192)
  • fileobj 必须支持 read()/write(),且是 binary 模式;用 open("x.gz", "rb") 得到的文件对象可以直接传

配合 io.BytesIO 实现内存中流式中转

当没有真实文件、又不想全量加载时,BytesIO 是最常用的“虚拟文件”。但注意它的位置指针(cursor)行为:写完不重置,后续读就是空。

示例:把一段文本压缩进 BytesIO,再解出来

import gzip
import io
<p>buf = io.BytesIO()
with gzip.GzipFile(fileobj=buf, mode="w") as gzf:
gzf.write(b"some data")</p><p>buf.seek(0)  # ← 这步不能少!否则 read() 返回空字节
with gzip.GzipFile(fileobj=buf, mode="r") as gzf:
data = gzf.read()  # b"some data"</p>
  • 写入后必须 buf.seek(0),否则解压器从末尾开始读
  • 如果只是单次压缩+解压,用 gzip.compress()/decompress() 更简洁;只有需要分块读写、或衔接其他流处理器(如 zlib 或加密流)时才上 GzipFile
  • BytesIO 本身不压缩,只是容器;真正的压缩发生在 GzipFile.write() 调用时

解压未知来源的 gzip 流时,优先用 gzip.open() + error handling

如果你拿到的是一个可能损坏、或非标准 gzip 格式的字节流(比如某些嵌入式设备返回的截断流),直接用 GzipFile 容易抛 OSError: Not a gzipped file 或更隐蔽的 zlib.error。这时推荐先试 gzip.open(),它内部做了更多格式探测和容错。

  • gzip.open() 默认按文件语义工作,但传 io.BytesIO 也能用:例如 gzip.open(buf, "rb")
  • 加 errors="ignore" 不生效(gzip 模块不支持该参数),真要容错得自己捕获 zlib.error 或 OSError
  • 若流开头缺 magic bytes(b"\x1f\x8b"),gzip.open() 会立刻失败;而 GzipFile 可能延迟到第一次 read() 才报错

流式 gzip 处理真正的难点不在 API 调用,而在控制 buffer 生命周期、游标位置和错误传播边界——尤其当多个 GzipFile 嵌套或与 zlib 手动对接时,漏掉一次 close() 或 seek() 就会导致静默失败。

热门AI工具

更多
豆包大模型

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

DeepSeek

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

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Laper
Laper Hot

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

WorkBuddy

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

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

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

1651

2023.07.20

python能做什么
python能做什么

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

4084

2023.07.25

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

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

1649

2023.07.31

python教程
python教程

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

23657

2023.08.03

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

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

2887

2023.08.04

python eval
python eval

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

2927

2023.08.04

scratch和python区别
scratch和python区别

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

1143

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

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

精品课程

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

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