在Python中使用zlib模块进行数据压缩的教程


Posted in Python onJune 26, 2015

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)。下面用一个例子来演示如何使用这两个方法:
 

#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来压缩的话,必须先一次性将文件里的数据读到内存里,然后将数据进行压缩。这样势必会战用太多的内存。如果使用对象来进行压缩,那么没有必要一次性读取文件的所有数据,可以先读一部分数据到内存里进行压缩,压缩完后写入文件,然后再读其他部分的数据压缩,如此循环重复,只到压缩完整个文件。下面一个例子来演示这之间的区别:
 

#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手册。

Python 相关文章推荐
Python 命令行参数sys.argv
Sep 06 Python
python使用自定义user-agent抓取网页的方法
Apr 15 Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 Python
Python通过poll实现异步IO的方法
Jun 04 Python
python获得一个月有多少天的方法
Jun 04 Python
python Pygame的具体使用讲解
Nov 03 Python
Python 3 判断2个字典相同
Aug 06 Python
python tornado修改log输出方式
Nov 18 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
Jan 14 Python
flask框架自定义url转换器操作详解
Jan 25 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
Python中的zipfile模块使用详解
Jun 25 #Python
Python实现保证只能运行一个脚本实例
Jun 24 #Python
Python中的默认参数详解
Jun 24 #Python
Python中的下划线详解
Jun 24 #Python
Python装饰器使用实例:验证参数合法性
Jun 24 #Python
Python线程详解
Jun 24 #Python
Python函数式编程指南(四):生成器详解
Jun 24 #Python
You might like
php的一个登录的类 [推荐]
2007/03/16 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
js函数排序的实例代码
2013/07/01 Javascript
理解JS事件循环
2016/01/07 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
python itchat实现微信自动回复的示例代码
2017/08/14 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
Python Pillow Image Invert
2019/01/22 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
国际象棋商店:The Chess Store
2018/07/09 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
材料加工硕士生求职信
2013/10/10 职场文书
车间工艺员岗位职责
2013/12/09 职场文书
优秀干部获奖感言
2014/01/31 职场文书
收银员岗位职责
2014/02/07 职场文书
自立自强的名人事例
2014/02/10 职场文书
高等教育学自荐书范文
2014/02/10 职场文书
幼儿园中班教师寄语
2014/04/03 职场文书
房屋租赁协议书
2014/04/10 职场文书
导游个人求职信
2014/04/25 职场文书
办公用品质量保证书
2015/05/11 职场文书
刮痧观后感
2015/06/05 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS