广告位联系
返回顶部
分享到

python压缩和解压缩模块之zlib的用法

python 来源:互联网 作者:佚名 发布时间:2022-09-28 17:22:17 人浏览
摘要

python压缩和解压缩模块之zlib 由于早期的zlib和Python之间不兼容,故推荐1.1.4以后的版本。导入zlib后可以查看版本号 1 2 3 4 5 import zlib zlib.ZLIB_VERSION 1.2.11 zlib.ZLIB_RUNTIME_VERSION 1.2.11 zlib中封装

python压缩和解压缩模块之zlib

由于早期的zlib和Python之间不兼容,故推荐1.1.4以后的版本。导入zlib后可以查看版本号

1

2

3

4

5

>>> import zlib

>>> zlib.ZLIB_VERSION

'1.2.11'

>>> zlib.ZLIB_RUNTIME_VERSION

'1.2.11'

zlib中封装了两对压缩和解压的函数

压缩 解压
compress decompress
compressobj decompressobj

其中compress和decompress比较简单,二者声明为

1

2

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,由于在解压过程中会自动调节,故不必完全精确。

例如:

1

2

3

4

5

6

7

8

9

>>> 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返回一个 压缩对象,用来压缩内存中难以容下的数据流,声明如下

1

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。这两个函数仅为验证数据的正确性,均无加密强度,不适合做密码。

1

2

3

4

>>> zlib.adler32(b'abcdefghijk')

434701411

>>> zlib.crc32(b'abcdefghijk')

3461812127

python中zlib库用法

zlib主要用于压缩与解压缩

  • 字符串:使用zlib.compress可以压缩字符串。使用zlib.decompress可以解压字符串。
  • 数据流:压缩:compressobj,解压:decompressobj

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

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。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://tinycool.blog.csdn.net/article/details/122432401
相关文章
  • Python Django教程之实现新闻应用程序

    Python Django教程之实现新闻应用程序
    Django是一个用Python编写的高级框架,它允许我们创建服务器端Web应用程序。在本文中,我们将了解如何使用Django创建新闻应用程序。 我们将
  • 书写Python代码的一种更优雅方式(推荐!)

    书写Python代码的一种更优雅方式(推荐!)
    一些比较熟悉pandas的读者朋友应该经常会使用query()、eval()、pipe()、assign()等pandas的常用方法,书写可读性很高的「链式」数据分析处理代码
  • Python灰度变换中伽马变换分析实现

    Python灰度变换中伽马变换分析实现
    1. 介绍 伽马变换主要目的是对比度拉伸,将图像灰度较低的部分进行修正 伽马变换针对的是对单个像素点的变换,也就是点对点的映射 形
  • 使用OpenCV实现迷宫解密的全过程

    使用OpenCV实现迷宫解密的全过程
    一、你能自己走出迷宫吗? 如下图所示,可以看到是一张较为复杂的迷宫图,相信也有人尝试过自己一点一点的找出口,但我们肉眼来解谜
  • Python中的数据精度问题的介绍

    Python中的数据精度问题的介绍
    一、python运算时精度问题 1.运行时精度问题 在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和
  • Python随机值生成的常用方法

    Python随机值生成的常用方法
    一、随机整数 1.包含上下限:[a, b] 1 2 3 4 import random #1、随机整数:包含上下限:[a, b] for i in range(10): print(random.randint(0,5),end= | ) 查看运行结
  • Python字典高级用法深入分析讲解
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python浅析多态与鸭子类型使用实例
    什么多态:同一事物有多种形态 为何要有多态=》多态会带来什么样的特性,多态性 多态性指的是可以在不考虑对象具体类型的情况下而直
  • Python字典高级用法深入分析介绍
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本

    Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本
    我们的目标是秒杀淘宝或京东等的订单,这里面有几个关键点,首先需要登录淘宝或京东,其次你需要准备好订单,最后要在指定时间快速
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计