设为首页 收藏本站
查看: 1540|回复: 0

[经验分享] Python模块学习 ---- zlib 数据压缩

[复制链接]

尚未签到

发表于 2015-12-15 08:31:42 | 显示全部楼层 |阅读模式
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手册。

原始链接


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151278-1-1.html 上篇帖子: python time, datetime, string, timestamp相互转换 下篇帖子: Python 内置函数大全
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表