python压缩和解压缩模块之zlib的用法
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-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 这篇文章主要介绍了Go语言压缩和解压缩tar.gz文件的方法,实例分析了使用Go语言压缩文件与解压文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-03
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
Python getsizeof()和getsize()区分详解
这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20- 这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
- 这篇文章主要介绍了解决python 两个时间戳相减出现结果错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-12
- 这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08