欢迎来到山村网

在Python中使用zlib模块进行数据压缩的教程

2019-03-02 14:21:34浏览:775 来源:山村网   
核心摘要:  这篇文章主要介绍了在Python中使用zlib模块进行数据压缩的教程,是Python入门学习中的基础知识,需要的朋友可以参考下  Pyth

  这篇文章主要介绍了在Python中使用zlib模块进行数据压缩的教程,是Python入门学习中的基础知识,需要的朋友可以参考下

  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)。下面用一个例子来演示如何使用这两个方法:

  ?

  19#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来压缩的话,必须先一次性将文件里的数据读到内存里,然后将数据进行压缩。这样势必会战用太多的内存。如果使用对象来进行压缩,那么没有必要一次性读取文件的所有数据,可以先读一部分数据到内存里进行压缩,压缩完后写入文件,然后再读其他部分的数据压缩,如此循环重复,只到压缩完整个文件。下面一个例子来演示这之间的区别:

  ?

 

  66#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读取TXT到数组及列表去重后按原来顺序排序的方法

上一篇:

IIS预编译提升加载速度

  • 信息二维码

    手机看新闻

  • 分享到
打赏
免责声明
• 
本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们 xfptx@outlook.com