各位用户为了找寻关于在Python中使用zlib模块进行数据压缩的教程的资料费劲了很多周折。这里教程网为您整理了关于在Python中使用zlib模块进行数据压缩的教程的相关资料,仅供查阅,以下为您介绍关于在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分别用于设置系统缓冲区大小(window buffer )与输出缓冲区大小(output buffer)。下面用一个例子来演示如何使用这两个方法:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19#coding=gbk
import
zlib, 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)
print
len
(
str
)
print
len
(str1)
print
len
(str2)
# ---- 结果
#5783
#1531
#5783
我们也可以使用Compress/Decompress对象来对数据进行压缩/解压缩。zlib.compressobj([level]) 与zlib.decompress(string[, wbits[, bufsize]]) 分别创建Compress/Decompress缩对象。通过对象对数据进行压缩和解压缩的使用方式与上面介绍的zlib.compress,zlib.decompress非常类似。但两者对数据的压缩还是有区别的,这主要体现在对大量数据进行操作的情况下。假如现在要压缩一个非常大的数据文件(上百M),如果使用zlib.compress来压缩的话,必须先一次性将文件里的数据读到内存里,然后将数据进行压缩。这样势必会战用太多的内存。如果使用对象来进行压缩,那么没有必要一次性读取文件的所有数据,可以先读一部分数据到内存里进行压缩,压缩完后写入文件,然后再读其他部分的数据压缩,如此循环重复,只到压缩完整个文件。下面一个例子来演示这之间的区别:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66#coding=gbk
import
zlib, 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]
/
for
i
in
range
((
len
(data)
+
chunk_size)
/
chunk_size)]
str_obj2
=
''
for
chunk
in
str_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]
/
for
i
in
range
((
len
(str_obj2)
+
chunk_size)
/
chunk_size)]
str_obj2
=
''
for
chunk
in
str_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手册。