Python zlib庫,什麼是 Python 中的 zlib?

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
UBCDC的頭像UBCDC
上一篇 2025-01-14 18:55
下一篇 2025-01-14 18:55

相關推薦

  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論