在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系列之新版本导入httplib模块报ImportError解决方案
May 23 Python
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
Python File readlines() 使用方法
Mar 19 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
Python循环结构的应用场景详解
Jul 11 Python
python-tornado的接口用swagger进行包装的实例
Aug 29 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
基于python的itchat库实现微信聊天机器人(推荐)
Oct 29 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
django中嵌套的try-except实例
May 21 Python
使用Python爬虫爬取小红书完完整整的全过程
Jan 19 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+Html+缓存
2006/12/20 PHP
PHP 读取文件的正确方法
2009/04/29 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
JQuery的一些小应用收集
2010/03/27 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
简单模拟node.js中require的加载机制
2016/10/27 Javascript
详解vue添加删除元素的方法
2018/06/30 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
Vue数据双向绑定底层实现原理
2019/11/22 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
原生js实现九宫格拖拽换位
2021/01/26 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python选课系统开发程序
2016/09/02 Python
微信跳一跳python代码实现
2018/01/05 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
Python Numpy中数据的常用保存与读取方法
2020/04/01 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
努比亚手机官网:nubia
2016/10/06 全球购物
计算机本科生自荐信
2013/10/15 职场文书
电子银行营销方案
2014/02/22 职场文书
老师的检讨书
2014/02/23 职场文书
老公给老婆的保证书
2014/04/28 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript