python压缩和解压缩模块之zlib的用法
作者:微小冷 发布时间:2023-09-19 08:32:07
python压缩和解压缩模块之zlib
由于早期的zlib和Python之间不兼容,故推荐1.1.4以后的版本。导入zlib后可以查看版本号
>>> import zlib
>>> zlib.ZLIB_VERSION
'1.2.11'
>>> zlib.ZLIB_RUNTIME_VERSION
'1.2.11'
zlib中封装了两对压缩和解压的函数
压缩 | 解压 |
---|---|
compress | decompress |
compressobj | decompressobj |
其中compress和decompress比较简单,二者声明为
zlib.compress(data, level=-1)
zlib.decompress(data, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE)
即分别对data进行压缩和解压。
其中level为整数,用于指定压缩等级,决定压缩后文件的大小,取值为-1到9。
zlib中内置了四个常量,用以表示四种情况。
压缩模式 | ||
---|---|---|
1 | Z_BEST_SPEED | 最快速度和最低压缩率 |
9 | Z_BEST_COMPRESSION | 最慢速度最高压缩率 |
0 | Z_NO_COMPRESSION | 不压缩 |
-1 | Z_DEFAULT_COMPRESSION | 一般相当于设压缩等级为6 |
解压函数中的wbits控制历史缓冲区的大小(或称“窗口大小”)以及所期望的头部和尾部格式。
默认为MAX_WBITS,其取值范围和含义如下
包含头尾 | ||
---|---|---|
+8至+15 | 必须 | 窗口尺寸以二为底的对数。输入必须包含zlib头部和尾部。 |
0 | 必须含头 | 根据 zlib 头部自动确定窗口大小 |
−8至−15 | 无头尾 | 使用wbits绝对值作为窗口大小以二为底的对数 |
+24至+31 | 必须包含 | 使用后4个比特位作为窗口大小以二为底的对数。 |
+40 至+47 | 自动 | 使用后4个比特位作为窗口大小以二为底的对数 |
bufsize是表示缓冲区初始大小,默认为DEF_MEM_LEVEL,由于在解压过程中会自动调节,故不必完全精确。
例如:
>>> x = b'abcdefghijk'*100
>>> x0 = compress(x,0)
>>> x1 = compress(x,1)
>>> x9 = compress(x,9)
>>> print(len(x),len(x0), len(x1), len(x9))
1100 1111 32 29 #无压缩时得到的数据比原始数据还大
>>> d1 = decompress(x9) #解压缩
>>> d1 == x
True
compressobj
和decompressobj
分别返回一个压缩对象和解压对象。compressobj
返回一个 压缩对象,用来压缩内存中难以容下的数据流,声明如下
compressobj(level=-1, method=DEFLATED, wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=Z_DEFAULT_STRATEGY[, zdict])
其中level为压缩级别,和前文一样取值为 -1 到 9;method 表示压缩算法,现在只支持 DEFLATED;memLevel指定内部压缩操作时所占用内存大小。参数取 1 到 9,默认DEF_MEM_LEVEL,取值越大越占内存,但速度更快。
wbits 和decompress中相似,但取值范围更少,默认是15(MAX_WBITS)。
参数范围如下:
+9 至 +15 | 窗口大小以二为底的对数。 即这些值对应着 512 至 32768 的窗口大小。 更大的值会提供更好的压缩,同时内存开销也会更大。 压缩输出会包含 zlib 特定格式的头部和尾部。 |
−9 至 −15 | 绝对值为窗口大小以二为底的对数。 压缩输出仅包含压缩数据,没有头部和尾部。 |
+25 至 +31 | 后 4 个比特位为窗口大小以二为底的对数。 压缩输出包含一个基本的 gzip 头部,并以校验和为尾部。 |
strategy
用于调节压缩算法,默认即可。zdict
指定预定义的压缩字典。是一个字节序列,其中包含用户认为要压缩的数据中可能频繁出现的子序列。频率高的子序列应当放在字典的尾部。
除了压缩和解压缩,zlib还提供了两个数据校验的函数,
函数 | 算法 | |
---|---|---|
zlib.adler32 | Adler-32校验 | |
zlib.crc32 | CRC(循环冗余)校验 |
二者均输入数据和校验起始值,校验起始值value默认为1。这两个函数仅为验证数据的正确性,均无加密强度,不适合做密码。
>>> zlib.adler32(b'abcdefghijk')
434701411
>>> zlib.crc32(b'abcdefghijk')
3461812127
python中zlib库用法
zlib主要用于压缩与解压缩
字符串:使用zlib.compress可以压缩字符串。使用zlib.decompress可以解压字符串。
数据流:压缩:compressobj,解压:decompressobj
示例代码:
import zlib
data = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz' \
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
print(len(data))
print(data)
# 压缩
compressed_data = zlib.compress(data.encode()) # 注意:这儿要以字节的形式传入
print(len(compressed_data))
print(compressed_data)
# 解压
new_data = zlib.decompress(compressed_data).decode()
print(len(new_data))
print(new_data)
运行结果:
示例代码2:
import zlib
# 压缩文件或数据
def compress_data(file, zip_file, level=9):
file = open(file, 'rb')
zip_file = open(zip_file, 'wb')
compress = zlib.compressobj(level)
data = file.read(1024)
while data:
zip_file.write(compress.compress(data))
data = file.read(1024)
zip_file.write(compress.flush())
file.close()
zip_file.close()
# 解压文件或数据
def decompress_data(zip_file, new_file):
zip_file = open(zip_file, 'rb')
new_file = open(new_file, 'wb')
decompress = zlib.decompressobj()
data = zip_file.read(1024)
while data:
new_file.write(decompress.decompress(data))
data = zip_file.read(1024)
new_file.write(decompress.flush())
zip_file.close()
new_file.close()
if __name__ == '__main__':
file = 'text.txt'
zip_file = 'text_zip.txt'
compress_data(file, zip_file)
new_file = 'test_new.txt'
decompress_data(zip_file, new_file)
print('end!')
运行结果:
注意:
compressobj返回一个压缩对象,用来压缩不能一下子读入内存的数据流。
level 从9到-1表示压缩等级,其中1最快但压缩度最小,9最慢但压缩度最大,0不压缩,默认是-1大约相当于与等级6,是一个压缩速度和压缩度适中的level。
来源:https://tinycool.blog.csdn.net/article/details/122432401


猜你喜欢
- 本文主要讲述的是Python中的模块的概念,具体如下。模块是python组织代码的基本方式:python的脚本都是用扩展名为py的文本文件保
- 它在Lynx里也会运行得很好:<%@ Language=VBScript %><HTML><
- 什么是高阶函数高阶函数就是能够把函数当成参数传递的函数就是高阶函数,换句话说如果一个函数的参数是函数,那么这个函数就是一个高阶函数。高阶函数
- 循环用于重复执行一些程序块。从上一讲的选择结构,我们已经看到了如何用缩进来表示程序块的隶属关系。循环也会用到类似的写法。for循环for循环
- 概述由MySQL5.0 版本开始支持存储过程。如果在实现用户的某些需求时,需要编写一组复杂的SQL语句才能实现的时候,那么我们就可以将这组复
- 本文实例讲述了MySQL从命令行导入SQL脚本时出现中文乱码的解决方法。分享给大家供大家参考,具体如下:在图形界面管理工具 MySql Qu
- 1. 删除列表(list)的三种方式(1).按照元素删除—remove()直接删除具体某个元素,remove里面传递的是
- 一提到python,大家经常会提到爬虫,爬虫近来兴起的原因我觉得主要还是因为大数据的原因,大数据导致了我们的数据不在只存在于自己的服务器,而
- 需求开发过程中开发者经常面对的一个需求就是:一个项目可能会在不同的环境下运行,本地开发环境、测试环境、灰度环境、生产环境。每个环境的参数和配
- 每次遇到pandas的dataframe某列日期格式问题总会哉坑,下面记录一下常用时间日期函数....1、字符串转化为日期 str—>
- bytes 和 bytearraybytes 和 bytearray 都是二进制世界的成员,用二进制的方式去理解才能看清他的本质。理解byt
- (需要安装psutil 用来获取服务器资源,以及pymongo驱动)#pip install psutil#pip install pymo
- 小编把之前整理的关于mysql 5.7.9 免安装版配置方法分享给大家,供大家参考,具体内容如下1. 解压MySQL压缩包将下载的MySQL
- NOMONEYDAY123114321-45324212-102250331008为了符合阅读习惯,最终报表希望是如下格式:NOMONTUE
- 在本文中,我们将介绍 Python 中 _ 字符的不同用法。就像 Python 中的许多其他内容一样,我们会看到 “_” 的不同用法主要是惯
- 前提条件1.了解Python语言,并会安装第三方库2.了解Python Web Flask框架3.了解PyTorch深度学习框架实验环境Py
- 新上的一台服务器出现了一个现象:ASP程序中,调用函数Now(),显示的时间总是形如“2009-07-12 上午 08:12:56”这样的,
- 一、使用copula生成合成数据集(synthetic dataset)1. 三维数据描述建立一个三维数据表,查看三维数据的散点
- 目前由于phantomjs已经不维护了,而新版的Chrome(59+)推出了Headless模式,对爬虫来说尤其是定时任务的爬虫截屏之类的是
- 一.一维数组的转置描述一维数组的重塑就是将一行或一列的数组转换为多行多列的数组重塑之后的数组应于原有数组形状兼容(数组元素应该相等)用法和参