zlib 是一個支持 zlib C 庫的 Python 庫,zlib C 庫是對縮減無損壓縮演算法的更高級概括。zlib
庫用於無損壓縮,這意味著壓縮和解壓縮之間沒有數據丟失)。
它還提供了跨不同平台的可移植性優勢,並且不會擴展數據。
這個庫在安全性方面起著非常重要的作用。許多應用需要壓縮和解壓縮任意數據,如字元串、文件或結構化內存內容。
這個庫非常適合 gzip 文件格式/工具,是 UNIX 系統上最流行和最有用的壓縮應用。
壓縮()方法
zlib
庫方便我們使用compression()方法,用來壓縮一個數據串。下面是函數的語法。
compress(data, level=-1)
參數-
- data 參數指定要壓縮的位元組,級別表示介於-1 到 9 之間的整數值。level 參數用於定義壓縮級別。9 級表示最慢;但是,它帶來了最高的壓縮級別。值-1 是 6 級默認值。0 級不會產生壓縮。
讓我們理解下面的例子。
示例-
import zlib
import binascii
value = 'Welcome to JavaTpoint'
compressed_data = zlib.compress(value, 2)
print('Original data: ' + value)
print('Compressed data: ' + binascii.hexlify(compressed_data))
輸出:
Original data: Welcome to JavaTpoint
Compressed data: 785ef348cdc9c95728cf2fca49010018ab043d
如果我們將值 2 改為 0,那麼結果如下。
Original data: Welcome to JavaTpoint
Compressed data: 785ef348cdc9c95728cf2fca49010018ab043d
壓縮大數據流
zlib
庫提供了 comressobj() 功能來管理大數據流。此方法返回壓縮對象。語法如下。
語法-
compressobj(level=-1, method=DEFLATED, wbits=15, memLevel=8, strategy=Z_DEFAULT_STRATEGY[, zdict])
參數-
- 上面的方法接受 wbits 作為處理窗口大小的參數,輸出中包含頭和尾。以下是的可能值
| 價值 | 窗口大小對數 | 輸出 |
| +9 至+15 | 基數 2 | 它包括 zlib 頭部和尾部。 |
| +9 至-15 | 表示 wbit 的絕對值 | 不包括標題和尾部。 |
| +25 至+31 | 該值的低 4 位。 | 它包括報頭和尾部校驗和。 |
- 方法參數定義了壓縮中使用的演算法。放氣是默認的或者我們可以說當前可能的演算法。
- 策略參數定義了壓縮調優。建議現在只使用其默認值。
讓我們理解下面的例子
示例-
import zlib
import binascii
data = 'Welcome to JavaTpoint'
compress = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, -15)
compressed_data = compress.compress(data)
compressed_data += compress.flush()
print('Original: ' + data)
print('Compressed data: ' + binascii.hexlify(compressed_data))
輸出:
Original: Hello world
Compressed data: f348cdc9c95728cf2fca490100
解釋-
我們取了一個簡單的字元串值,它不是一個大數據流,它的目的是顯示 compressobj() 函數的工作情況。字元串「歡迎使用 JavaTpoint」已被壓縮。通常,當數據流太大或不適合內存時,使用這種方法。這種方法在一個更大的應用中起著至關重要的作用,在這個應用中,我們可以配置壓縮,並且可以用來連續壓縮部分數據。
它在需要壓縮的地方起著重要的作用。藉助compression . compression(data)方法,我們可以壓縮和刷新數據塊,而無需在內存中累積全部數據。
壓縮文件
我們將使用壓縮()方法來壓縮文件。語法與前面的例子相似。
在下面的例子中,我們將壓縮 PNG 圖像「mountain.png」。
讓我們理解下面的例子。
示例-
import zlib
original_data = open(r'C:\Users\DEVANSH SHARMA\Pictures\Saved Pictures\mountain.png', 'rb').read()
compressed_data = zlib.compress(original_data, zlib.Z_BEST_COMPRESSION)
compress_ratio = (float(len(original_data)) - float(len(compressed_data))) / float(len(original_data))
print('Compressed: %d%%' % (100.0 * compress_ratio))
輸出:
Compressed: 10%
在上面的例子中,我們使用了 Z_BEST_COMPRESSION,這是該演算法必須提供的最佳壓縮級別。在下一行中,我們根據壓縮數據長度與原始數據的比率來計算壓縮級別。文件被壓縮了 13%,這就是如何壓縮 ASCII 字元串或二進位圖像數據。
將壓縮數據保存到文件
我們還可以將壓縮的數據保存在一個文件中以供進一步使用。在下面的例子中,我們將一些壓縮文本顯示到一個文件中。
示例-
import zlib
my_data = 'Welcome to JavaTpoint'
compressed_data = zlib.compress(my_data, 2)
f = open('outfile.txt', 'w')
f.write(compressed_data)
f.close()
當我們運行上述程序時,它會壓縮給定的字元串,並將壓縮後的數據保存到一個名為「output.txt」的文件中。
解壓
解壓縮也是應用的一個重要方面。zlib
庫提供了解壓()方法。下面是它的語法。
語法:
decompress(data, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE)
參數-
- 數據參數是位元組格式的值。
- wbits 參數用於管理歷史緩衝區的大小。可能的緩衝值如下。
| 價值 | 窗口大小對數 | 投入 |
| +8 至+15 | 基數 2 | 它包括 zlib 頭部和尾部 |
| -8 到-15 歲 | 它代表了 wbits 的絕對優勢 | 它包括沒有頭和尾的原始流 |
| +24 至+31 = 16 + (8 至 15) | 它代表該值的低 4 位 | 它包括 gzip 標題和尾部 |
| +40 至+47 = 32 + (8 至 15) | 它代表該值的低 4 位 | zlib 或 gzip 格式 |
- bufsize 參數指示緩衝區大小。這個論點最好的一點是,它不需要精確;當需要額外的緩衝區時,它的值會自動增加。
讓我們理解下面的例子。
示例-
import zlib
data = 'Welcome to JavaTpoint'
compressed_data = zlib.compress(data, 2)
decompressed_data = zlib.decompress(compressed_data)
print('Decompressed data: ' + decompressed_data)
輸出:
Welcome to JavaTpoint
解壓縮大數據流
在解壓縮大數據流時,由於數據的大小或來源,我們可能會面臨內存管理問題。我們有可能無法將所有可用的內存用於該特定任務。因此,解壓縮 obj() 允許我們將一個大的流分成多個塊,這些塊可以單獨解壓縮。
語法如下。
語法-
decompressobj(wbits=15[, zdict])
上述方法返回解壓對象,用於解壓特定數據。
讓我們理解下面的例子。
示例-
import zlib
data = 'Welcome to JavaTpoint'
compress = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, +15)
compressed_data = compress.compress(data)
compressed_data += compress.flush()
print('Data before Decompress: ' + data)
print('Data After Decompress: ' + compressed_data)
f = open('compressed.datd', 'w')
f.write(compressed_data)
f.close()
CHUNKSIZE = 1024
data2 = zlib.decompressobj()
my_file = open('compressed.dat', 'rb')
buffer_value = my_file.read(CHUNKSIZE)
# Decompress stream chunks
while buffer_value:
decompressed_data = data2.decompress(buf)
buf = my_file.read(CHUNKSIZE)
decompressed_data += data2.flush()
print('Decompressed data: ' + decompressed_data)
my_file.close()
輸出:
Data Before Decompress: Welcome to JavaTpoint
Data After Decompress - #@$%%#@@#s
Decompressed Data: Welcome to JavaTpoint
從文件中解壓縮數據
正如我們在前面的例子中所討論的,我們可以輕鬆地解壓縮文件中包含的數據。這個例子類似於前面的例子;我們從文件中獲取數據,只是在這種情況下,我們將使用解壓()方法。當數據小到可以很容易地放入內存時,這種方法很有用。
讓我們理解下面的例子。
示例-
import zlib
compressed_data = open('hello.dat', 'rb').read()
decompressed_data = zlib.decompress(compressed_data)
print(decompressed_data)
解釋-
我們已經閱讀了包含「歡迎來到 JavaTpoint」的 hello.dat。但是,該文件包含一個小字元串,因此我們使用了解壓縮()而不是解壓縮 obj() 函數。
結論
當應用需要安全級別的壓縮時,Python zlib
庫非常有用。它有一堆優秀的功能。我們已經討論了 zlib
庫的一些重要概念,儘管有許多函數可用。壓縮()和解壓縮()方法用於小數據,而壓縮 obj()和解壓縮 obj()方法通過支持數據流的壓縮/解壓縮來提供更大的靈活性。
原創文章,作者:UBCDC,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/329700.html