国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-23 01:39:30
字體:
來源:轉載
供稿:網友

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=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來壓縮的話,必須先一次性將文件里的數據讀到內存里,然后將數據進行壓縮。這樣勢必會戰用太多的內存。如果使用對象來進行壓縮,那么沒有必要一次性讀取文件的所有數據,可以先讀一部分數據到內存里進行壓縮,壓縮完后寫入文件,然后再讀其他部分的數據壓縮,如此循環重復,只到壓縮完整個文件。下面一個例子來演示這之間的區別:
 

#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 '-' * 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壓縮后: 1531zlib.decompress解壓后: 5783------------------------------Compress.compress壓縮后: 1531Decompress.decompress解壓后: 5783------------------------------分塊壓縮后: 1531分塊解壓后: 5783            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湘潭县| 南皮县| 东乡县| 仪陇县| 连城县| 金寨县| 新津县| 南皮县| 富顺县| 苗栗县| 韶山市| 清徐县| 神农架林区| 承德市| 嘉义县| 合阳县| 锡林郭勒盟| 上蔡县| 安岳县| 澎湖县| 柏乡县| 河北省| 库车县| 西吉县| 广饶县| 彭山县| 满城县| 闸北区| 甘洛县| 静宁县| 阜南县| 类乌齐县| 拜泉县| 博白县| 大竹县| 临澧县| 丹江口市| 类乌齐县| 阜平县| 离岛区| 合江县|