在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的Django框架中的URL配置与松耦合
Jul 15 Python
浅析Python 中整型对象存储的位置
May 16 Python
Python随机函数random()使用方法小结
Apr 29 Python
Python查找文件中包含中文的行方法
Dec 19 Python
Python Celery多队列配置代码实例
Nov 22 Python
使用pygame写一个古诗词填空通关游戏
Dec 03 Python
python列表切片和嵌套列表取值操作详解
Feb 27 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
Sep 01 Python
PyQt5中QSpinBox计数器的实现
Jan 18 Python
一文带你掌握Pyecharts地理数据可视化的方法
Feb 06 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 Python
bat批处理之字符串操作的实现
Mar 16 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 has encountered an Access Violation
2007/01/15 PHP
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
Three.js实现绘制字体模型示例代码
2017/09/26 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
Python生成器(Generator)详解
2015/04/13 Python
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
巴西婴儿用品商店:Bebe Store
2017/11/23 全球购物
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
四风问题自查报告剖析材料
2014/02/08 职场文书
竞选学生会演讲稿
2014/04/25 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
初中体育课教学反思
2016/02/16 职场文书
python flask框架快速入门
2021/05/14 Python