python壓縮和解壓縮模塊之zlib的用法
python壓縮和解壓縮模塊之zlib
由于早期的zlib和Python之間不兼容,故推薦1.1.4以后的版本。導(dǎo)入zlib后可以查看版本號
>>> import zlib >>> zlib.ZLIB_VERSION '1.2.11' >>> zlib.ZLIB_RUNTIME_VERSION '1.2.11'
zlib中封裝了兩對壓縮和解壓的函數(shù)
| 壓縮 | 解壓 |
|---|---|
| compress | decompress |
| compressobj | decompressobj |
其中compress和decompress比較簡單,二者聲明為
zlib.compress(data, level=-1) zlib.decompress(data, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE)
即分別對data進(jìn)行壓縮和解壓。
其中l(wèi)evel為整數(shù),用于指定壓縮等級,決定壓縮后文件的大小,取值為-1到9。
zlib中內(nèi)置了四個常量,用以表示四種情況。
| 壓縮模式 | ||
|---|---|---|
| 1 | Z_BEST_SPEED | 最快速度和最低壓縮率 |
| 9 | Z_BEST_COMPRESSION | 最慢速度最高壓縮率 |
| 0 | Z_NO_COMPRESSION | 不壓縮 |
| -1 | Z_DEFAULT_COMPRESSION | 一般相當(dāng)于設(shè)壓縮等級為6 |
解壓函數(shù)中的wbits控制歷史緩沖區(qū)的大?。ɑ蚍Q“窗口大小”)以及所期望的頭部和尾部格式。
默認(rèn)為MAX_WBITS,其取值范圍和含義如下
| 包含頭尾 | ||
|---|---|---|
| +8至+15 | 必須 | 窗口尺寸以二為底的對數(shù)。輸入必須包含zlib頭部和尾部。 |
| 0 | 必須含頭 | 根據(jù) zlib 頭部自動確定窗口大小 |
| −8至−15 | 無頭尾 | 使用wbits絕對值作為窗口大小以二為底的對數(shù) |
| +24至+31 | 必須包含 | 使用后4個比特位作為窗口大小以二為底的對數(shù)。 |
| +40 至+47 | 自動 | 使用后4個比特位作為窗口大小以二為底的對數(shù) |
bufsize是表示緩沖區(qū)初始大小,默認(rèn)為DEF_MEM_LEVEL,由于在解壓過程中會自動調(diào)節(jié),故不必完全精確。
例如:
>>> x = b'abcdefghijk'*100 >>> x0 = compress(x,0) >>> x1 = compress(x,1) >>> x9 = compress(x,9) >>> print(len(x),len(x0), len(x1), len(x9)) 1100 1111 32 29 #無壓縮時得到的數(shù)據(jù)比原始數(shù)據(jù)還大 >>> d1 = decompress(x9) #解壓縮 >>> d1 == x True
compressobj和decompressobj分別返回一個壓縮對象和解壓對象。compressobj返回一個 壓縮對象,用來壓縮內(nèi)存中難以容下的數(shù)據(jù)流,聲明如下
compressobj(level=-1, method=DEFLATED, wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=Z_DEFAULT_STRATEGY[, zdict])
其中l(wèi)evel為壓縮級別,和前文一樣取值為 -1 到 9;method 表示壓縮算法,現(xiàn)在只支持 DEFLATED;memLevel指定內(nèi)部壓縮操作時所占用內(nèi)存大小。參數(shù)取 1 到 9,默認(rèn)DEF_MEM_LEVEL,取值越大越占內(nèi)存,但速度更快。
wbits 和decompress中相似,但取值范圍更少,默認(rèn)是15(MAX_WBITS)。
參數(shù)范圍如下:
| +9 至 +15 | 窗口大小以二為底的對數(shù)。 即這些值對應(yīng)著 512 至 32768 的窗口大小。 更大的值會提供更好的壓縮,同時內(nèi)存開銷也會更大。 壓縮輸出會包含 zlib 特定格式的頭部和尾部。 |
| −9 至 −15 | 絕對值為窗口大小以二為底的對數(shù)。 壓縮輸出僅包含壓縮數(shù)據(jù),沒有頭部和尾部。 |
| +25 至 +31 | 后 4 個比特位為窗口大小以二為底的對數(shù)。 壓縮輸出包含一個基本的 gzip 頭部,并以校驗(yàn)和為尾部。 |
strategy用于調(diào)節(jié)壓縮算法,默認(rèn)即可。zdict指定預(yù)定義的壓縮字典。是一個字節(jié)序列,其中包含用戶認(rèn)為要壓縮的數(shù)據(jù)中可能頻繁出現(xiàn)的子序列。頻率高的子序列應(yīng)當(dāng)放在字典的尾部。
除了壓縮和解壓縮,zlib還提供了兩個數(shù)據(jù)校驗(yàn)的函數(shù),
| 函數(shù) | 算法 | |
|---|---|---|
| zlib.adler32 | Adler-32校驗(yàn) | |
| zlib.crc32 | CRC(循環(huán)冗余)校驗(yàn) |
二者均輸入數(shù)據(jù)和校驗(yàn)起始值,校驗(yàn)起始值value默認(rèn)為1。這兩個函數(shù)僅為驗(yàn)證數(shù)據(jù)的正確性,均無加密強(qiáng)度,不適合做密碼。
>>> zlib.adler32(b'abcdefghijk') 434701411 >>> zlib.crc32(b'abcdefghijk') 3461812127
python中zlib庫用法
zlib主要用于壓縮與解壓縮
- 字符串:使用zlib.compress可以壓縮字符串。使用zlib.decompress可以解壓字符串。
- 數(shù)據(jù)流:壓縮:compressobj,解壓:decompressobj
示例代碼:
import zlib
data = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz' \
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
print(len(data))
print(data)
# 壓縮
compressed_data = zlib.compress(data.encode()) # 注意:這兒要以字節(jié)的形式傳入
print(len(compressed_data))
print(compressed_data)
# 解壓
new_data = zlib.decompress(compressed_data).decode()
print(len(new_data))
print(new_data)運(yùn)行結(jié)果:

示例代碼2:
import zlib
# 壓縮文件或數(shù)據(jù)
def compress_data(file, zip_file, level=9):
file = open(file, 'rb')
zip_file = open(zip_file, 'wb')
compress = zlib.compressobj(level)
data = file.read(1024)
while data:
zip_file.write(compress.compress(data))
data = file.read(1024)
zip_file.write(compress.flush())
file.close()
zip_file.close()
# 解壓文件或數(shù)據(jù)
def decompress_data(zip_file, new_file):
zip_file = open(zip_file, 'rb')
new_file = open(new_file, 'wb')
decompress = zlib.decompressobj()
data = zip_file.read(1024)
while data:
new_file.write(decompress.decompress(data))
data = zip_file.read(1024)
new_file.write(decompress.flush())
zip_file.close()
new_file.close()
if __name__ == '__main__':
file = 'text.txt'
zip_file = 'text_zip.txt'
compress_data(file, zip_file)
new_file = 'test_new.txt'
decompress_data(zip_file, new_file)
print('end!')運(yùn)行結(jié)果:

注意:
compressobj返回一個壓縮對象,用來壓縮不能一下子讀入內(nèi)存的數(shù)據(jù)流。
level 從9到-1表示壓縮等級,其中1最快但壓縮度最小,9最慢但壓縮度最大,0不壓縮,默認(rèn)是-1大約相當(dāng)于與等級6,是一個壓縮速度和壓縮度適中的level。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中if?__name__==‘__main__‘用法詳情
這篇文章主要介紹了Python中if?__name__==‘__main__‘用法詳情,文章首先通過我們先定義一個test01.py的文件展開詳情,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2022-06-06
python一招完美搞定Chromedriver的自動更新問題
這篇文章主要介紹了python一招完美搞定Chromedriver的自動更新,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
python3實(shí)現(xiàn)單目標(biāo)粒子群算法
這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)單目標(biāo)粒子群算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
PyTorch的Optimizer訓(xùn)練工具的實(shí)現(xiàn)
這篇文章主要介紹了PyTorch的Optimizer訓(xùn)練工具的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
python爬取企查查企業(yè)信息之selenium自動模擬登錄企查查
這篇文章主要介紹了python爬取企查查企業(yè)信息之自動模擬登錄企查查以及selenium獲取headers,selenium獲取cookie,需要的朋友可以參考下2021-04-04
Django項(xiàng)目中動態(tài)設(shè)置靜態(tài)文件路徑的全過程
這篇文章主要給大家介紹了關(guān)于Django項(xiàng)目中動態(tài)設(shè)置靜態(tài)文件路徑的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02

