使用 Python (lzma) 進行 LZMA 演算法壓縮


**Lempel-Ziv-Markov 鏈演算法**(LZMA) 使用字典壓縮方案執行無損資料壓縮,其壓縮率高於其他壓縮演算法。Python 的 lzma 模組包含用於使用 LZMA 演算法壓縮和解壓縮資料的類和便捷函式。

雖然此模組中的功能類似於 bz2 模組,但與 BZ2File 類相比,LZMAFile 類不是執行緒安全的。

同樣,lzma 模組中的 open() 函式是開啟 lzma 壓縮檔案物件的非常簡單的方法。

open()

此函式開啟一個 LZMA 壓縮檔案並返回一個檔案物件。該函式需要兩個主要引數——檔名和模式。模式引數預設為“rb”,但可以採用以下任何值

binary mode - "r", "rb", "w", "wb", "x", "xb", "a" or "ab"
text mode - "rt", "wt", "xt", or "at"

compress()

此函式使用 LZMA 演算法壓縮給定資料並返回一個位元組物件。此函式可以選擇具有一個格式引數,該引數決定容器格式。可能的值為 FORMAT_XZ(預設值)和 FORMAT_ALONE。

decompress()

此函式解壓縮資料並返回未壓縮的位元組物件。

以上函式在以下示例中使用。要將 LZMA 壓縮資料寫入檔案

>>> import lzma
>>> data = b"Welcome to TutorialsPoint"
>>> f = lzma.open("test.xz","wb")
>>>f.write(data)
>>>f.close()

將在當前工作目錄中建立一個“test.xz”檔案。要從該檔案獲取未壓縮的資料,請使用以下程式碼。

>>> import lzma
>>> f = lzma.open("test.xz","rb")
>>> data = f.read()
>>> data
b'Welcome to TutorialsPoint'

要使用 lzma 模組的面向物件 API 執行壓縮,我們必須使用 LZMAFile 類

LZMAFile()

這是 LZMAFile 類的建構函式。它需要指定檔案和模式。具有“w”或“wb”模式的物件使其可使用 write() 方法。

write()

此方法壓縮給定資料並將其寫入其下方的檔案。

>>> data = b'Welcome to TutorialsPoint'
>>>obj = lzma.LZMAFile("test.xz", mode="wb")
>>>obj.write(data)
>>>obj.close()

壓縮檔案被讀取,並且使用以 mode='rb' 引數建立的 LZMAFile 物件的 read() 方法檢索未壓縮的資料。

read()

此方法從壓縮檔案讀取資料並返回未壓縮的資料。

>>>obj = lzma.LZMAFile("test.xz", mode="rb")
>>> data=obj.read()
>>> data
b'Welcome to TutorialsPoint'

LZMA 演算法也允許將壓縮資料寫入已開啟的檔案。在以下示例中,“test.txt”以“wb”模式正常開啟(使用內建的 open() 函式),並向其中寫入一些文字。之後,使用相同的檔案寫入壓縮資料。

>>> f = open("test.txt","wb")
>>>f.write(b"Hello world")
>>>fp = lzma.open(f,"wb")
>>>fp.write(b"Welcome to Python")
>>>f.write(b"Thank you")
>>>f.close()
>>>fp.flush()
>>>fp.close()

執行上述程式碼後,“test.txt”將出現在當前目錄中。它包含如下所示的壓縮和未壓縮資料的混合。

Hello worldý7zXZ æÖ´F!t/å£Thank you

與 bz2 模組一樣,lzma 模組也具有增量壓縮器和解壓縮器類。

LZMACompressor()

這是一個建構函式,它返回增量壓縮器物件。多個塊可以單獨壓縮,並將它們的連線資料寫入檔案

compress()

此方法壓縮給定資料並返回位元組物件

flush()

此方法清空緩衝區並返回一個位元組物件。

以下示例使用增量壓縮器物件壓縮列表物件。

>>> data = [b'Hello World', b'How are you?', b'welcome to Python']
>>> obj = lzma.LZMACompressor()
>>> bindata = []
>>> for i in data:
bindata.append(obj.compress(i))
>>> bindata.append(obj.flush())
>>> bindata
[b'\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3', b'', b'', b"\x01\x00'Hello WorldHow are you?welcome to Python\x00\xf5\xc6\xc1d|\xf3\x8ey\x00\x01@(\xd4RJ\xe5\x1f\xb6\xf3}\x01\x00\x00\x00\x00\x04YZ"]

上述程式碼構建 bindata 作為原始列表中每個專案的壓縮位元組表示的列表。要使用**LZMADecompressor**物件檢索未壓縮的資料,請使用以下語句

>>> obj = lzma.LZMADecompressor()
>>> binstr = b''.join(bindata)
>>> obj.decompress(binstr)
b'Hello WorldHow are you?welcome to Python'

本文透過示例解釋了 lzma 模組中的類和函式。

更新於: 2020-06-26

4K+ 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.