zl程序教程

您现在的位置是:首页 >  其他

当前栏目

10. 数据压缩和打包

打包 10 数据压缩
2023-09-14 09:10:34 时间

本库主要提供了数据压缩功能和打包功能,压缩支持比如使用zlibgzipbzip2lzma等算法进行压缩,打包功能支持ZIPtar方式打包。

10.1 zlib--gzip兼容的压缩库

本模块主要提供了zlib库来对数据进行压缩和解压缩的操作。zlib是一个开源的项目,可以查看相关网站http://www.zlib.netPython里使用的版本是大于1.1.3的版本,对前面的版本不再兼容,推荐使用1.1.4版本。

 

本模块提供了下面的异常处理和函数:

exception zlib.error

当压缩或解压缩时抛出异常错误。

 

zlib.adler32(data[, value])

对数据计算Adler-32检验码,Adler-32是与CRC32一样的功能检验码,不过它的计算量更少。如果参数value存在,就作为检验码的初始值。不过要注意本函数计算的检码只是作为检验作用,没有达到授权和签名的安全级别。返回值总是一个无符号的32位整数。

 

zlib.compress(data[, level])

bytes类型的数据data进行压缩,返回bytes类型对象。参数level是压缩的级别。0是表示不压缩,1是最快压缩,9是最好压缩率的压缩。默认是6级。

 

zlib.compressobj(level=-1, method=DEFLATED, wbits=15, memlevel=8, strategy=Z_DEFAULT_STRATEGY[, zdict])

创建一个压缩对象返回,用来压缩那些不能一次性地把数据放到内存里的数据。参数level是压缩级别;参数method是采用压缩算法;参数wbits是压缩时使用压缩窗口的大小,值介于815之间,越高使用内存就越多;参数memlevel是控制内部压缩状态保存的大小,值介于19之间,越高占用内存越多,但速度越快;参数strategy是设置压缩算法,可以选择设置的值有Z_DEFAULT_STRATEGY, Z_FILTERED, Z_HUFFMAN_ONLY;参数zdict是预先定义的压缩字典。

 

zlib.crc32(data[, value])

对数据data计算CRC32检验码。如果值value出现,就作初始计算码。返回无符号32位整数。

 

zlib.decompress(data[, wbits[, bufsize]])

解压bytes表示的数据data,返回一个bytes类型对象包含解压后的数据。参数wbits是设置解压缓冲区的大小,可选择为815;参数bufsize是保存解压后数据的缓冲区大小。

 

zlib.decompressobj(wbits=15[, zdict])

返回一个解压流数据的对象,解压不能一次性地加载数据到内存。参数与压缩的函数相同。

 

Compress.compress(data)

流压缩对象的压缩数据函数,返回已经被压缩的部分数据。

 

Compress.flush([mode])

所有未曾被压缩的数据进行压缩,返回压缩后的数据对象。参数mode可选参数为:Z_SYNC_FLUSH, Z_FULL_FLUSH, 或者Z_FINISH, 默认为Z_FINISH

 

Compress.copy()

返回一个压缩对象的拷贝。

 

Decompress.unused_data

解压对象的将要解压的数据。

 

Decompress.unconsumed_tail

解压对象返回未解压的部分数据。

 

Decompress.eof

是否达到被解压的数据结束位置,如果是返回True

 

Decompress.decompress(data[, max_length])

解压数据,返回解压的数据对象。参数data将要解压的数据对象;参数max_length是指定返回的数据长度不要大于指定值。

 

Decompress.flush([length])

未被解压的部分数据将会立即解压,并返回解压后的数据。调用本函数之后,不能再调用解压函数decompress()

 

Decompress.copy()

返回一个解压对象的拷贝。

 

zlib.ZLIB_VERSION

zlib库编译的版本号。

 

zlib.ZLIB_RUNTIME_VERSION

实际zlib库被加载运行的版本号。

 

例子:

#python 3.4

import zlib

 

message = 'aaaabbbbccccdddd'

compressed = zlib.compress(message.encode('utf-8'))

decompressed = zlib.decompress(compressed)

print('original:', repr(message))

print('compressed:', repr(compressed))

print('decompressed:', repr(decompressed.decode('utf-8')))

结果输出如下:

original: 'aaaabbbbccccdddd'

compressed: b'x\x9cKLLLL\x02\x82d H\x01\x02\x004\x14\x06)'

decompressed: 'aaaabbbbccccdddd'

 

例子:

def compress(infile, dst, level=9):

    infile = open(infile, 'rb')

    dst = open(dst, 'wb')

    compress = zlib.compressobj(level)

    data = infile.read(1024)

    while data:

        dst.write(compress.compress(data))

        data = infile.read(1024)

    dst.write(compress.flush())

def decompress(infile, dst):

    infile = open(infile, 'rb')

    dst = open(dst, 'wb')

    decompress = zlib.decompressobj()

    data = infile.read(1024)

    while data:

        dst.write(decompress.decompress(data))

        data = infile.read(1024)

    dst.write(decompress.flush())



蔡军生  QQ:9073204  深圳