​bz2 --- 对 bzip2 压缩算法的支持​

news2024/7/2 3:59:36

源代码: Lib/bz2.py


此模块提供了使用 bzip2 压缩算法压缩和解压数据的一套完整的接口。

bz2 模块包含:

  • 用于读写压缩文件的 open() 函数和 BZ2File 类。

  • 用于增量压缩和解压的 BZ2Compressor 和 BZ2Decompressor 类。

  • 用于一次性压缩和解压的 compress() 和 decompress() 函数。

文件压缩和解压

bz2.open(filenamemode='rb'compresslevel=9encoding=Noneerrors=Nonenewline=None)

以二进制或文本模式打开 bzip2 压缩文件,返回一个 file object。

和 BZ2File 的构造函数类似,filename 参数可以是一个实际的文件名(str 或 bytes 对象),或是已有的可供读取或写入的文件对象。

mode 参数可设为二进制模式的 'r''rb''w''wb''x''xb''a' 或 'ab',或者文本模式的 'rt''wt''xt' 或 'at'。默认是 'rb'

compresslevel 参数是 1 到 9 的整数,和 BZ2File 的构造函数一样。

对于二进制模式,这个函数等价于 BZ2File 构造器: BZ2File(filename, mode, compresslevel=compresslevel)。 在这种情况下,不可提供 encodingerrors 和 newline 参数。

对于文本模式,将会创建一个 BZ2File 对象,并将它包装到一个 io.TextIOWrapper 实例中,此实例带有指定的编码格式、错误处理行为和行结束符。

3.3 新版功能.

在 3.4 版更改: 添加了 'x' (单独创建) 模式。

在 3.6 版更改: 接受一个 path-like object。

class bz2.BZ2File(filenamemode='r'*compresslevel=9)

用二进制模式打开 bzip2 压缩文件。

如果 filename 是一个 str 或 bytes 对象,则打开名称对应的文件目录。 否则的话,filename 应当是一个 file object,它将被用来读取或写入压缩数据。

mode 参数可以是表示读取的 'r' (默认值),表示覆写的 'w',表示单独创建的 'x',或表示添加的 'a'。 这些模式还可分别以 'rb''wb''xb' 和 'ab' 的等价形式给出。

如果 filename 是一个文件对象(而不是实际的文件名),则 'w' 模式并不会截断文件,而是会等价于 'a'

如果 mode 为 'w' 或 'a',则 compresslevel 可以是 1 到 9 之间的整数,用于指定压缩等级: 1 产生最低压缩率,而 9 (默认值) 产生最高压缩率。

如果 mode 为 'r',则输入文件可以为多个压缩流的拼接。

BZ2File 提供了 io.BufferedIOBase 所指定的所有成员,但 detach() 和 truncate() 除外。 并支持迭代和 with 语句。

BZ2File 还提供了以下方法:

peek([n])

返回缓冲的数据而不前移文件位置。 至少将返回一个字节的数据(除非为 EOF)。 实际返回的字节数不确定。

备注

虽然调用 peek() 不会改变 BZ2File 的文件位置,但它可能改变下层文件对象的位置(举例来说如果 BZ2File 是通过传入一个文件对象作为 filename 的话)。

3.3 新版功能.

fileno()

返回底层文件的文件描述符。

3.3 新版功能.

readable()

返回文件是否已被打开供读取。

3.3 新版功能.

seekable()

返回文件是否支持定位。

3.3 新版功能.

writable()

返回文件是否已被打开供写入。

3.3 新版功能.

read1(size=- 1)

读取至多 size 个未压缩字节,将会避免多次从下层流读取。 如果 size 为负值则读取至多为缓冲区数据大小。

如果文件位置为 EOF 则返回 b''

3.3 新版功能.

readinto(b)

将字节数据读取到 b

返回读取的字节数(0 表示 EOF)。

3.3 新版功能.

在 3.1 版更改: 添加了对 with 语句的支持。

在 3.3 版更改: 添加了对 filename 使用 file object 而非实际文件名的支持。

在 3.3 版更改: 添加了 'a' (append) 模式,以及对读取多数据流文件的支持。

在 3.4 版更改: 添加了 'x' (单独创建) 模式。

在 3.5 版更改: read() 方法现在接受 None 作为参数。

在 3.6 版更改: 接受一个 path-like object。

在 3.9 版更改: buffering 形参已被移除。 它自 Python 3.0 起即被忽略并弃用。 请传入一个打开文件对象来控制文件的打开方式。

compresslevel 形参成为仅限关键字参数。

在 3.10 版更改: 这个类在面对多个同时读取器和写入器时是线程安全的,就如它在 gzip 和 lzma 中的等价类所具有的特性一样。

增量压缩和解压

class bz2.BZ2Compressor(compresslevel=9)

创建一个新的压缩器对象。 此对象可被用来执行增量数据压缩。 对于一次性压缩,请改用 compress() 函数。

如果给定 compresslevel,它必须为 1 至 9 之间的整数。 默认值为 9

compress(data)

向压缩器对象提供数据。 在可能的情况下返回一段已压缩数据,否则返回空字节串。

当你已结束向压缩器提供数据时,请调用 flush() 方法来完成压缩进程。

flush()

结束压缩进程,返回内部缓冲中剩余的压缩完成的数据。

调用此方法之后压缩器对象将不可再被使用。

class bz2.BZ2Decompressor

创建一个新的解压缩器对象。 此对象可被用来执行增量数据解压缩。 对于一次性解压缩,请改用 decompress() 函数。

备注

这个类不会透明地处理包含多个已压缩数据流的输入,这不同于 decompress() 和 BZ2File。 如果你需要通过 BZ2Decompressor 来解压缩多个数据流输入,你必须为每个数据流都使用新的解压缩器。

decompress(datamax_length=- 1)

解压缩 data (一个 bytes-like object),返回字节串形式的解压缩数据。 某些 data 可以在内部被缓冲,以便用于后续的 decompress() 调用。 返回的数据应当与之前任何 decompress() 调用的输出进行拼接。

如果 max_length 为非负数,将返回至多 max_length 个字节的解压缩数据。 如果达到此限制并且可以产生后续输出,则 needs_input 属性将被设为 False。 在这种情况下,下一次 decompress() 调用提供的 data 可以为 b'' 以获取更多的输出。

如果所有输入数据都已被解压缩并返回(或是因为它少于 max_length 个字节,或是因为 max_length 为负数),则 needs_input 属性将被设为 True

在到达数据流末尾之后再尝试解压缩数据会引发 EOFError。 在数据流末尾之后获取的任何数据都会被忽略并存储至 unused_data 属性。

在 3.5 版更改: 添加了 max_length 形参。

eof

若达到了数据流的末尾标记则为 True

3.3 新版功能.

unused_data

在压缩数据流的末尾之后获取的数据。

如果在达到数据流末尾之前访问此属性,其值将为 b''

needs_input

如果在要求新的未解压缩输入之前 decompress() 方法可以提供更多的解压缩数据则为 False

3.5 新版功能.

一次性压缩或解压缩

bz2.compress(datacompresslevel=9)

压缩 data,此参数为一个 字节类对象。

如果给定 compresslevel,它必须为 1 至 9 之间的整数。 默认值为 9

对于增量压缩,请改用 BZ2Compressor。

bz2.decompress(data)

解压缩 data,此参数为一个 字节类对象。

如果 data 是多个压缩数据流的拼接,则解压缩所有数据流。

对于增量解压缩,请改用 BZ2Decompressor。

在 3.3 版更改: 支持了多数据流的输入。

用法示例

以下是 bz2 模块典型用法的一些示例。

使用 compress() 和 decompress() 来显示往复式的压缩:

>>>

>>> import bz2
>>> data = b"""\
... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue
... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem,
... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus
... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat.
... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo
... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum
... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum."""
>>> c = bz2.compress(data)
>>> len(data) / len(c)  # Data compression ratio
1.513595166163142
>>> d = bz2.decompress(c)
>>> data == d  # Check equality to original object after round-trip
True

使用 BZ2Compressor 进行增量压缩:

>>>

>>> import bz2
>>> def gen_data(chunks=10, chunksize=1000):
...     """Yield incremental blocks of chunksize bytes."""
...     for _ in range(chunks):
...         yield b"z" * chunksize
...
>>> comp = bz2.BZ2Compressor()
>>> out = b""
>>> for chunk in gen_data():
...     # Provide data to the compressor object
...     out = out + comp.compress(chunk)
...
>>> # Finish the compression process.  Call this once you have
>>> # finished providing data to the compressor.
>>> out = out + comp.flush()

上面的示例使用了一个相当 "非随机" 的数据流(即 b"z" 块的数据流)。 随机数据的压缩率通常很差,而有序、重复的数据通常会产生很高的压缩率。

用二进制模式写入和读取 bzip2 压缩文件:

>>>

>>> import bz2
>>> data = b"""\
... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue
... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem,
... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus
... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat.
... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo
... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum
... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum."""
>>> with bz2.open("myfile.bz2", "wb") as f:
...     # Write compressed data to file
...     unused = f.write(data)
...
>>> with bz2.open("myfile.bz2", "rb") as f:
...     # Decompress data from file
...     content = f.read()
...
>>> content == data  # Check equality to original object after round-trip
True

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1302503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程、容器与虚拟机的区别

进程、容器与虚拟机 参考:关于进程、容器与虚拟机的区别,你想知道的都在这! 进程、容器与虚拟机的结构图 进程 介绍 进程是一个正在运行的程序,它是一个个可执行文件的实例。当一个可执行文件从硬盘加载到内存中的时候&#xf…

安装Anconda时出现Failed to extract packages的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法 1. 问题所示 在win7安装Anconda的时候,出现Failed to extract packages 截图如下所示: 2. 原理分析 该版本过于新,无法兼容win7系统,要么更换系统 要么将anconda版本降低即可 3. 解决…

基于SSM超市订单管理系统(Java毕业设计)

大家好,我是DeBug,很高兴你能来阅读!作为一名热爱编程的程序员,我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里,我将会结合实际项目经验,分享编程技巧、最佳实践以及解决问题的方法。无论你是…

计算机二级Python基本操作题-序号46

Python 函数查询 1. 《卖火柴的小女孩》是丹麦童话故事作家安徒生的一篇童话故事,发表于1846年。主要讲了一个卖火柴的小女孩在富人阖家欢乐、举杯共庆的大年夜冻死在街头的故事。这里给出《卖火柴的小女孩》的一个网络版本文件,文件名为“小女孩.txt”…

IOday8作业

使用消息队列完成两个进程之间相互通信(多进程) #include<myhead.h>//定义结构体 struct buf {long mtype;char mtest[1024]; };#define SIZE (sizeof(struct buf)-sizeof(long))//进程 int main(int argc, const char *argv[]) {//创建keykey_t key1 ftok("/&quo…

关于北京医学sci论文翻译

在医学领域&#xff0c;翻译论文是一项非常重要的工作。医学论文的翻译需要准确、专业、严谨&#xff0c;同时也需要考虑到医学领域的特殊性和复杂性。那么&#xff0c;如何翻译医学论文呢&#xff1f;北京医学SCI论文翻译哪家好呢&#xff1f; 首先&#xff0c;需要具备专业的…

5.鸿蒙hap可以直接点击包安装吗?

5.鸿蒙hap可以直接点击包安装吗&#xff1f; hap与apk不同&#xff0c;获取的hap不能直接安装 安装方法1&#xff1a; DevEco studio打开项目源文件&#xff0c;打开手机USB调试&#xff0c;DevEco识别到手机后&#xff0c;点击播放按钮安装到手机 https://txwtech.blog.cs…

多线程案例-阻塞队列

阻塞队列是什么 阻塞队列是一种特殊的队列.也遵循"先进先出"的原则 阻塞队列能是一种线程安全的数据结构,并且具有以下特性: 当队列满的时候,继续入队列就会阻塞,直到有其他线程从队列中取走元素. 当队列空的时候,继续出队列也会阻塞,直到有其他线程往队列中插入元素…

小电流MOSFET 选型分析数据,可应用于电子烟,电动工具,智能穿戴等产品上

小电流双N&#xff0c;D-N通道MOSFET&#xff0c;电压60V-100V左右 电流300mA-500MA&#xff0c;采用封装形式多样。具有低导通电阻&#xff0c;可快速切换速度&#xff0c;易于设计的驱动电路也易于并联&#xff0c;ESD保护&#xff0c;低电压驱动使该器件非常适合便携式设备…

相控与斩控交交调压(THD的计算)

相控与斩控交交调压&#xff08;THD的计算&#xff09;

ML81N服务条目表创建审批

ML81N服务条目表创建 ME23N创建服务类采购订单 ML81N根据采购订单明细创建服务条目表 保存后采购订单会生成物料凭证 删除 创建 参考ESLL表&#xff0c;需要区分父包&#xff0c;子包&#xff1b;其中ls_esll-pln_pckg需要根据EKPO关联ESSR关联ESLL获取到原始包装编号 …

WampServer本地部署结合内网穿透实现公网访问本地服务

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…

认识lambda架构(架构师考试复习)

Lambda架构主要分为三层&#xff0c;批处理层、加速层和服务层。 如下图所示&#xff1a; &#xff08;1&#xff09;批处理层&#xff08;Batch Layer&#xff09;&#xff1a;存储数据集&#xff0c;在数据集上预先计算查询函数&#xff0c;并构建查询对应的view。Batch Lay…

perl处理json的序列化和反序列化

perl可以使用JSON模块很方便的处理json的序列化和反序列化。先来一段简单的例子&#xff1a; #! /usr/bin/perl use v5.14; use JSON; use IO::File;my $info {id > 1024,desc > hello world,arry > [1, 2, 3, 4, 5],obj > {char > [ A, B, C ]} };say to_jso…

企业网站运营不稳定有什么影响

如果一个公司的网站打开都有困难&#xff0c;那么用户会对这个企业的实力产生怀疑&#xff0c;企业网站除了作为企业的名片外&#xff0c;更多的是承担增加企业交易订单的任务。因此很多网站会做有关的网络广告或者搜索引擎优化的工作。如果网站无法正常打开&#xff0c;那么用…

从零开发短视频电商 AWS OpenSearch Service开发环境申请以及Java客户端介绍

文章目录 创建域1.创建域2.输入配置部署选项数据节点网络精细访问控制访问策略 获取域端点数据如何插入到OpenSearch ServiceJava连接OpenSearch Servicespring-data-opensearchelasticsearch-rest-high-level-clientopensearch-rest-clientopensearch-java 因为是开发测试使用…

视频中自监督学习:「我的世界」下指令理解与跟随

本文介绍了北京大学人工智能研究院梁一韬助理教授所带领的 CraftJarvis 团队在「我的世界」环境下探索通用智能体设计的新进展&#xff0c;题为“GROOT: Learning to Follow Instructions by Watching Gameplay Videos”。 ​ GROOT 该研究的核心目标是探索能否摆脱文本数据的标…

12.11 作业

1&#xff0c; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码…

MySQL笔记-第01章_数据库概述

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第01章_数据库概述1. 为什么要使用数据库2. 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库…

关于王道3.4_3GBN协议中对滑动窗口大小范围的讲述模糊表述的思考

这里是假设滑动窗口大小为4的不合理环境下&#xff0c;对为什么不合理原因的模糊表述。 下面是我对理解&#xff1a;为什么不可以是4 发送方在收到第一个ack0之后滑动窗口后移&#xff0c;可发送窗口内为1230&#xff0c; 接收方收到ack0此时存在二义性&#xff1a; 1、发送方发…