网络编程
位置:首页>> 网络编程>> Python编程>> python压缩和解压缩模块之zlib的用法

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

作者:微小冷  发布时间:2023-09-19 08:32:07 

标签: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中封装了两对压缩和解压的函数

压缩解压
compressdecompress
compressobjdecompressobj

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

zlib.compress(data, level=-1)
zlib.decompress(data, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE)

即分别对data进行压缩和解压。

其中level为整数,用于指定压缩等级,决定压缩后文件的大小,取值为-1到9。

zlib中内置了四个常量,用以表示四种情况。

  压缩模式
1Z_BEST_SPEED最快速度和最低压缩率
9Z_BEST_COMPRESSION最慢速度最高压缩率
0Z_NO_COMPRESSION不压缩
-1Z_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
  • compressobjdecompressobj分别返回一个压缩对象和解压对象。

  • 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.adler32Adler-32校验 
zlib.crc32CRC(循环冗余)校验 

二者均输入数据和校验起始值,校验起始值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)

运行结果:

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

示例代码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!')

运行结果:

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

注意:

compressobj返回一个压缩对象,用来压缩不能一下子读入内存的数据流。

level 从9到-1表示压缩等级,其中1最快但压缩度最小,9最慢但压缩度最大,0不压缩,默认是-1大约相当于与等级6,是一个压缩速度和压缩度适中的level。

来源:https://tinycool.blog.csdn.net/article/details/122432401

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com