在Python中使用zlib模块进行数据压缩的教程
Python标准模块中,有多个模块用于数据的压缩与解压缩,如zipfile,gzip,bz2等等。上次介绍了zipfile模块,今天就来讲讲zlib模块。
zlib.compress(string[,level])
zlib.decompress(string[,wbits[,bufsize]])
zlib.compress用于压缩流数据。参数string指定了要压缩的数据流,参数level指定了压缩的级别,它的取值范围是1到9。压缩速度与压缩率成反比,1表示压缩速度最快,而压缩率最低,而9则表示压缩速度最慢但压缩率最高。zlib.decompress用于解压数据。参数string指定了需要解压的数据,wbits和bufsize分别用于设置系统缓冲区大小(windowbuffer)与输出缓冲区大小(outputbuffer)。下面用一个例子来演示如何使用这两个方法:
#coding=gbk importzlib,urllib fp=urllib.urlopen('http://localhost/default.html') str=fp.read() fp.close() #----压缩数据流。 str1=zlib.compress(str,zlib.Z_BEST_COMPRESSION) str2=zlib.decompress(str1) printlen(str) printlen(str1) printlen(str2) #----结果 #5783 #1531 #5783
我们也可以使用Compress/Decompress对象来对数据进行压缩/解压缩。zlib.compressobj([level])与zlib.decompress(string[,wbits[,bufsize]])分别创建Compress/Decompress缩对象。通过对象对数据进行压缩和解压缩的使用方式与上面介绍的zlib.compress,zlib.decompress非常类似。但两者对数据的压缩还是有区别的,这主要体现在对大量数据进行操作的情况下。假如现在要压缩一个非常大的数据文件(上百M),如果使用zlib.compress来压缩的话,必须先一次性将文件里的数据读到内存里,然后将数据进行压缩。这样势必会战用太多的内存。如果使用对象来进行压缩,那么没有必要一次性读取文件的所有数据,可以先读一部分数据到内存里进行压缩,压缩完后写入文件,然后再读其他部分的数据压缩,如此循环重复,只到压缩完整个文件。下面一个例子来演示这之间的区别:
#coding=gbk importzlib,urllib fp=urllib.urlopen('http://localhost/default.html') #访问的到的网址。 data=fp.read() fp.close() #----压缩数据流 str1=zlib.compress(data,zlib.Z_BEST_COMPRESSION) str2=zlib.decompress(str1) print'原始数据长度:',len(data) print'-'*30 print'zlib.compress压缩后:',len(str1) print'zlib.decompress解压后:',len(str2) print'-'*30 #----使用Compress,Decompress对象对数据流进行压缩/解压缩 com_obj=zlib.compressobj(zlib.Z_BEST_COMPRESSION) decom_obj=zlib.decompressobj() str_obj=com_obj.compress(data) str_obj+=com_obj.flush() print'Compress.compress压缩后:',len(str_obj) str_obj1=decom_obj.decompress(str_obj) str_obj1+=decom_obj.flush() print'Decompress.decompress解压后:',len(str_obj1) print'-'*30 #----使用Compress,Decompress对象,对数据进行分块压缩/解压缩。 com_obj1=zlib.compressobj(zlib.Z_BEST_COMPRESSION) decom_obj1=zlib.decompressobj() chunk_size=30; #原始数据分块 str_chunks=[data[i*chunk_size:(i+1)*chunk_size]/ foriinrange((len(data)+chunk_size)/chunk_size)] str_obj2='' forchunkinstr_chunks: str_obj2+=com_obj1.compress(chunk) str_obj2+=com_obj1.flush() print'分块压缩后:',len(str_obj2) #压缩数据分块解压 str_chunks=[str_obj2[i*chunk_size:(i+1)*chunk_size]/ foriinrange((len(str_obj2)+chunk_size)/chunk_size)] str_obj2='' forchunkinstr_chunks: str_obj2+=decom_obj1.decompress(chunk) str_obj2+=decom_obj1.flush() print'分块解压后:',len(str_obj2) #----结果------------------------ 原始数据长度:5783 ------------------------------ zlib.compress压缩后:1531 zlib.decompress解压后:5783 ------------------------------ Compress.compress压缩后:1531 Decompress.decompress解压后:5783 ------------------------------ 分块压缩后:1531 分块解压后:5783
Python手册对zlib模块的介绍比较详细,更具体的应用,可以参考Python手册。