Python模組學習 —- zlib 資料壓縮

來源:互聯網
上載者:User

  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 '-' * 30print '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手冊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.