Python模块学习 ---- zlib 数据压缩

目录(?)[+]

  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=gbkimport zlib, urllibfp = 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=gbkimport zlib, urllibfp = 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模块学习 ---- zlib 数据压缩相关推荐

  1. python textwrap_python2.7.3编译python模块学习- textwrap 文本包装和填充

    python模块学习- textwrap 文本包装和填充 代码实例: sample_text = ''' The textwrap module can beused to format text f ...

  2. Python模块学习 - 用tinify模块压缩和优化图片

    Python模块学习 - 用tinify模块压缩和优化图片 tinify模块 功能描述:TinyPNG和TinyJPG网站提供了压缩和优化.png和.jpg格式图片的功能.虽然可以很轻松地使用网页版进 ...

  3. python模块学习笔记

    python模块学习笔记 1.Python自动发送邮件smtplib 2.制作二维码图片MyQR 3.绝对值模块math 4.CSV模块 5.openpyxl 模块,操作Excel文件 ExcelMa ...

  4. Python模块学习:glob 文件路径查找

    文章转载自<伯乐在线>原文出处: Darkbull Python模块学习:glob 文件路径查找 glob模块是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用w ...

  5. 解惑Python模块学习,该如何着手操作...

    Python模块 晚上和朋友聊天,说到公司要求精兵计划,全员都要有编程能力.然后C.Java.Python-对于零基础入门的,当然是选择Python的人较多了.可朋友说他只是看了简单的语法,可pyth ...

  6. Python模块学习-----optparse

    作用:一种类似于dos命令行的一种设计模块,例如:dos命令中添加-f会触发一种事件           可以自定义一些指令,用来完成某些操作 optparse.OptionParser() opti ...

  7. 【Python模块学习】pandas模块简介

    pandas模块学习 一.背景概述 Pandas (Python Data Analysis Library) 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的. numpy更加适用 ...

  8. python模块学习(1)

    模块让你能够有逻辑地组织你的Python代码段.把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用. 简单地说,模块就是一个保存了P ...

  9. Python模块学习

    阅读目录 第一篇:Python模块之netmiko 第二篇:Python模块之junos-eznc 第三篇:Python模块之pexpect 第四篇:Python模块之paramiko 第五篇:Pyt ...

最新文章

  1. DVWA提示Unable to connect to the database.
  2. TensorFlow for Hackers (Part VII) - Credit Card Fraud Detection using Autoencoders in Keras
  3. Python如何进行内存管理?
  4. Yii抛出的各种异常
  5. group by 的实现原理
  6. 阿里java架构师面试128题含答案:分布式架构+Dubbo+多线程+Redis
  7. Kubernetes入门--搭建Kubernetes集群,并启动容器服务
  8. 如何在Mac上将iCloud照片库备份到Mac硬盘?
  9. 创建FTP和Web虚拟目录的方法!
  10. 爬虫实战 -- QQ空间自动点赞!太强了呀!
  11. Elasticsearch:部署 ECE (Elastic Cloud Enterprise)
  12. 山东一卡通获省内首家第三方支付牌照
  13. BZOJ2794: [Poi2012]Cloakroom【偏序+背包】
  14. Redis 运维实战 第07期:Hotkey
  15. n的阶乘(递归与非递归)
  16. 读SQL进阶教程笔记12_地址与三值逻辑
  17. 637. Average of Levels in Binary Tree
  18. 图8——判断有向图中是否有根
  19. 为什么程序员不那么爱说话
  20. ubuntu 16.04 清理内存空间的方法总结

热门文章

  1. Xcode中四种build for 的区别
  2. 键盘上每个键作用!!! (史上最全的)­
  3. Exchange2003反病毒
  4. 485通讯的校验和_RS485通讯如何实现三菱PLC对三菱变频器的控制?
  5. Android AlarmManager设置多个定时事件时只最后一个有效问题解决
  6. 转两篇关于国是的网文
  7. BZOJ3437:小P的牧场(斜率优化DP)
  8. 我的地盘我做主—玩转Python函数和变量
  9. Android 实现图片画画板
  10. Golang开发环境配置