在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 相关文章推荐
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
python optparse模块使用实例
Apr 09 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
python 实现在txt指定行追加文本的方法
Apr 29 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
python 常见字符串与函数的用法详解
Nov 23 Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
python pycharm的安装及其使用
Oct 11 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
keras topN显示,自编写代码案例
Jul 03 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 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
从MySQL数据库表中取出随机数据的代码
2007/09/05 PHP
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
javascript concat数组累加 示例
2009/09/03 Javascript
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
浅析javascript的return语句
2015/12/15 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
vue 全局封装loading加载教程(全局监听)
2020/11/05 Javascript
python rsa 加密解密
2017/03/20 Python
Python输出带颜色的字符串实例
2017/10/10 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
python exit出错原因整理
2020/08/31 Python
python里反向传播算法详解
2020/11/22 Python
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
应届生污水处理求职信
2013/11/06 职场文书
大学生四年生活自我鉴定
2013/11/21 职场文书
护士岗前培训自我评鉴
2014/02/28 职场文书
出国留学自荐信模板
2015/03/06 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python