IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]10. 数据压缩和打包

    caimouse发表于 2016-05-02 09:13:31
    love 0

    本库主要提供了数据压缩功能和打包功能,压缩支持比如使用zlib、gzip、bzip2和lzma等算法进行压缩,打包功能支持ZIP和tar方式打包。

    10.1 zlib--与gzip兼容的压缩库

    本模块主要提供了zlib库来对数据进行压缩和解压缩的操作。zlib是一个开源的项目,可以查看相关网站http://www.zlib.net,Python里使用的版本是大于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是压缩时使用压缩窗口的大小,值介于8与15之间,越高使用内存就越多;参数memlevel是控制内部压缩状态保存的大小,值介于1到9之间,越高占用内存越多,但速度越快;参数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是设置解压缓冲区的大小,可选择为8到15;参数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  深圳



沪ICP备19023445号-2号
友情链接