Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5017758
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2015-08-12 10:12:19

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


  1. #coding=gbk

  2. import zlib, urllib

  3. fp = urllib.urlopen('')
  4. str = fp.read()
  5. fp.close()

  6. #---- 压缩数据流。
  7. str1 = zlib.compress(str, zlib.Z_BEST_COMPRESSION)
  8. str2 = zlib.decompress(str1)
  9. print len(str)
  10. print len(str1)
  11. print len(str2)
  12.  
  13. # ---- 结果
  14. #5783
  15. #1531
  16. #5783
我们也可以使用Compress/Decompress对象来对数据进行压缩/解压缩。zlib.compressobj([level]) 与zlib.decompress(string[, wbits[, bufsize]]) 分别创建Compress/Decompress缩对象。通过对象对数据进行压缩和解压缩的使用方式与上面介绍的zlib.compress,zlib.decompress非常类似。但两者对数据的压缩还是有区别的,这主要体现在对大量数据进行操作的情况下。假如现在要压缩一个非常大的数据文件(上百M),如果使用zlib.compress来压缩的话,必须先一次性将文件里的数据读到内存里,然后将数据进行压缩。这样势必会战用太多的内存。如果使用对象来进行压缩,那么没有必要一次性读取文件的所有数据,可以先读一部分数据到内存里进行压缩,压缩完后写入文件,然后再读其他部分的数据压缩,如此循环重复,只到压缩完整个文件。下面一个例子来演示这之间的区别:


  1. #coding=gbk

  2. import zlib, urllib

  3. fp = urllib.urlopen('') # 访问的到的网址。
  4. data = fp.read()
  5. fp.close()

  6. #---- 压缩数据流
  7. str1 = zlib.compress(data, zlib.Z_BEST_COMPRESSION)
  8. str2 = zlib.decompress(str1)
  9. print '原始数据长度:', len(data)
  10. print '-' * 30
  11. print 'zlib.compress压缩后:', len(str1)
  12. print 'zlib.decompress解压后:', len(str2)
  13. print '-' * 30

  14. #---- 使用Compress, Decompress对象对数据流进行压缩/解压缩
  15. com_obj = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
  16. decom_obj = zlib.decompressobj()

  17. str_obj = com_obj.compress(data)
  18. str_obj += com_obj.flush()
  19. print 'Compress.compress压缩后:', len(str_obj)

  20. str_obj1 = decom_obj.decompress(str_obj)
  21. str_obj1 += decom_obj.flush()
  22. print 'Decompress.decompress解压后:', len(str_obj1)
  23. print '-' * 30

  24. #---- 使用Compress, Decompress对象,对数据进行分块压缩/解压缩。
  25. com_obj1 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
  26. decom_obj1 = zlib.decompressobj()
  27. chunk_size = 30;

  28. #原始数据分块
  29. str_chunks = [data[i * chunk_size:(i + 1) * chunk_size] /
  30.     for i in range((len(data) + chunk_size) / chunk_size)]

  31. str_obj2 = ''
  32. for chunk in str_chunks:
  33.     str_obj2 += com_obj1.compress(chunk)
  34. str_obj2 += com_obj1.flush()
  35. print '分块压缩后:', len(str_obj2)

  36. #压缩数据分块解压
  37. str_chunks = [str_obj2[i * chunk_size:(i + 1) * chunk_size] /
  38.     for i in range((len(str_obj2) + chunk_size) / chunk_size)]
  39. str_obj2 = ''
  40. for chunk in str_chunks:
  41.     str_obj2 += decom_obj1.decompress(chunk)
  42. str_obj2 += decom_obj1.flush()
  43. print '分块解压后:', len(str_obj2)
  44.  
  45. # ---- 结果 ------------------------
  46. 原始数据长度: 5783
  47. ------------------------------
  48. zlib.compress压缩后: 1531
  49. zlib.decompress解压后: 5783
  50. ------------------------------
  51. Compress.compress压缩后: 1531
  52. Decompress.decompress解压后: 5783
  53. ------------------------------
  54. 分块压缩后: 1531
  55. 分块解压后: 5783

Python手册对zlib模块的介绍比较详细,更具体的应用,可以参考Python手册。

原始链接

阅读(1511) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~