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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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來壓縮的話,必須先一次性將檔案裡的資料讀到記憶體裡,然後將資料進行壓縮。這樣勢必會戰用太多的記憶體。如果使用物件來進行壓縮,那麼沒有必要一次性讀取檔案的所有資料,可以先讀一部分資料到記憶體裡進行壓縮,壓縮完後寫入檔案,然後再讀其他部分的資料壓縮,如此迴圈重複,只到壓縮完整個檔案。下面一個例子來演示這之間的區別:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
#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手冊。