Python在数据压缩与解压缩方面提供了不少模块,比如zlib、gzip、bz2、zipfile、tarfile等模块。
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差不多。