程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 在Python中使用zlib模塊進行數據壓縮的教程

在Python中使用zlib模塊進行數據壓縮的教程

編輯:更多關於編程

       這篇文章主要介紹了在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手冊。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved