肉渣教程

数据压缩

上一节 下一节

Python在数据压缩与解压缩方面提供了不少模块,比如zlib、gzip、bz2、zipfile、tarfile等模块。


zlib模块

Python中内置的zlib模块是用来数据压缩与解压缩的,该模块常用的方法如下:

zlib模块方法 方法说明
zlib.compress 压缩字符串
zlib.decompress 解压缩字符串
zlib.compressobj 数据流压缩
zlib.decompressobj 数据流解压缩


示例1:字符串压缩与解压缩

下例中的变量s是待压缩的字符串,请尽量使用长度较长的字符串,这样才能看出压缩的效果,若使用太短的字符串,说不定压缩完还比原字符串更大;变量t是使用zlib压缩变量s得到的字符串;变量b是使用zlib解压变量t所得。

>>> import zlib
>>> s = "zhuanfou" * 100
>>> len(s)
800
>>> t = zlib.compress(s)
>>> len(t)
24
>>> b = zlib.decompress(t)
>>> s == b
True

运行一下


示例2:数据流压缩与解压缩

# coding=utf-8

import zlib

# 压缩文件
def compress(input_file, output_file, level=-1):
    input_file = open(input_file, 'rb')
    output_file = open(output_file, 'wb')
    compress = zlib.compressobj( level )
    data = input_file.read( 1024 )
    while data:
        output_file.write( compress.compress(data) )
        data = input_file.read( 1024 )
    output_file.write( compress.flush() )
    input_file.close()
    output_file.close()
    print "success compress"

# 解压缩文件
def decompress(input_file, output_file):
    input_file = open(input_file, 'rb')
    output_file = open(output_file, 'wb')
    decompress = zlib.decompressobj()
    data = input_file.read( 1024 )
    while data:
        output_file.write( decompress.decompress(data) )
        data = input_file.read( 1024 )
    output_file.write( decompress.flush() )
    input_file.close()
    output_file.close()
    print "success decompress"

if __name__ == "__main__":
    compress("source.txt", "compressed.txt")
    decompress("compressed.txt", "decompressed.txt")


source.txt是用来被压缩的源文件,compressed.txt是压缩source.txt得到的结果文件,decompressed.txt是解压compressed.txt所得到的文件。上述代码无法在专否沙盒中测试,请自行本地测试

使用zlib.compressobj方法来压缩文件,主要是因为文件可能较大而不能一次性全部读入内存,因此使用该方法就可以先返回一个压缩对象,再依次压缩读入内存的数据流

level这个参数表示的是压缩等级,level的取值范围是1到9的整数,外加-1这个整数;等级9代表压缩度最高,但压缩速度最慢;等级1代表压缩速度最快,但压缩度最低;-1是一种特殊的取值,也是默认的取值,-1代表压缩度与压缩速度相互适中,与等级6差不多。


数据压缩

上一节 下一节