在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实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
深入分析python数据挖掘 Json结构分析
Apr 21 Python
深入flask之异步非堵塞实现代码示例
Jul 31 Python
Python 数值区间处理_对interval 库的快速入门详解
Nov 16 Python
用python代码将tiff图片存储到jpg的方法
Dec 04 Python
django框架两个使用模板实例
Dec 11 Python
详解python tkinter模块安装过程
Jan 06 Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
TensorFlow固化模型的实现操作
May 26 Python
教你怎么用Python实现GIF动图的提取及合成
Jun 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
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
2007/02/23 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
Vue scoped及deep使用方法解析
2020/08/01 Javascript
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
Python Excel处理库openpyxl使用详解
2019/05/09 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
适合Python初学者的一些编程技巧
2020/02/12 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
Corelle官方网站:购买康宁餐具
2016/11/02 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
4s店总经理岗位职责
2013/12/31 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
摄影助理岗位职责
2014/02/07 职场文书
担保书怎么写
2014/04/01 职场文书
爱国口号
2014/06/19 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python