lzma
--- 用 LZMA 算法壓縮?
3.3 新版功能.
源代碼: Lib/lzma.py
此模塊提供了可以壓縮和解壓縮使用 LZMA 壓縮算法的數(shù)據(jù)的類和便攜函數(shù)。 其中還包含支持 xz 工具所使用的 .xz
和舊式 .lzma
文件格式的文件接口,以及相應的原始壓縮數(shù)據(jù)流。
此模塊所提供了接口與 bz2
模塊的非常類似。 請注意 LZMAFile
和 bz2.BZ2File
都 不是 線程安全的。,因此如果你需要在多個線程中使用單個 LZMAFile
實例,則需要通過鎖來保護它。
- exception lzma.LZMAError?
當在壓縮或解壓縮期間或是在初始化壓縮器/解壓縮器的狀態(tài)期間發(fā)生錯誤時此異常會被引發(fā)。
讀寫壓縮文件?
- lzma.open(filename, mode='rb', *, format=None, check=- 1, preset=None, filters=None, encoding=None, errors=None, newline=None)?
以二進制或文本模式打開 LZMA 壓縮文件,返回一個 file object。
filename 參數(shù)可以是一個實際的文件名(以
str
,bytes
或 路徑類 對象的形式給出),在此情況下會打開指定名稱的文件,或者可以是一個用于讀寫的現(xiàn)有文件對象。mode 參數(shù)可以是二進制模式的
"r"
,"rb"
,"w"
,"wb"
,"x"
,"xb"
,"a"
或"ab"
,或者文本模式的"rt"
,"wt"
,"xt"
或"at"
。 默認值為"rb"
。當打開一個文件用于讀取時,format 和 filters 參數(shù)具有與
LZMADecompressor
的參數(shù)相同的含義。 在此情況下,check 和 preset 參數(shù)不應被使用。當打開一個文件用于寫入的,format, check, preset 和 filters 參數(shù)具有與
LZMACompressor
的參數(shù)相同的含義。對于二進制模式,這個函數(shù)等價于
LZMAFile
構(gòu)造器:LZMAFile(filename, mode, ...)
。 在這種情況下,不可提供 encoding, errors 和 newline 參數(shù)。對于文本模式,將會創(chuàng)建一個
LZMAFile
對象,并將它包裝到一個io.TextIOWrapper
實例中,此實例帶有指定的編碼格式、錯誤處理行為和行結(jié)束符。在 3.4 版更改: 增加了對
"x"
,"xb"
和"xt"
模式的支持。在 3.6 版更改: 接受一個 path-like object。
- class lzma.LZMAFile(filename=None, mode='r', *, format=None, check=- 1, preset=None, filters=None)?
以二進制模式打開一個 LZMA 壓縮文件。
LZMAFile
可以包裝在一個已打開的 file object 中,或者是在給定名稱的文件上直接操作。 filename 參數(shù)指定所包裝的文件對象,或是要打開的文件名稱(類型為str
,bytes
或 路徑類 對象)。 如果是包裝現(xiàn)有的文件對象,被包裝的文件在LZMAFile
被關(guān)閉時將不會被關(guān)閉。mode 參數(shù)可以是表示讀取的
"r"
(默認值),表示覆寫的"w"
,表示單獨創(chuàng)建的"x"
,或表示添加的"a"
。 這些模式還可以分別以"rb"
,"wb"
,"xb"
和"ab"
的等價形式給出。如果 filename 是一個文件對象(而不是實際的文件名),則
"w"
模式并不會截斷文件,而會等價于"a"
。當打開一個文件用于讀取時,輸入文件可以為多個獨立壓縮流的拼接。 它們會被作為單個邏輯流被透明地解碼。
當打開一個文件用于讀取時,format 和 filters 參數(shù)具有與
LZMADecompressor
的參數(shù)相同的含義。 在此情況下,check 和 preset 參數(shù)不應被使用。當打開一個文件用于寫入的,format, check, preset 和 filters 參數(shù)具有與
LZMACompressor
的參數(shù)相同的含義。LZMAFile
支持io.BufferedIOBase
所指定的所有成員,但detach()
和truncate()
除外。 并支持迭代和with
語句。也提供以下方法:
- peek(size=- 1)?
返回緩沖的數(shù)據(jù)而不前移文件位置。 至少將返回一個字節(jié)的數(shù)據(jù),除非已經(jīng)到達 EOF。 實際返回的字節(jié)數(shù)不確定(會忽略 size 參數(shù))。
在 3.4 版更改: 增加了對
"x"
和"xb"
模式的支持。在 3.5 版更改:
read()
方法現(xiàn)在接受None
作為參數(shù)。在 3.6 版更改: 接受一個 path-like object。
在內(nèi)存中壓縮和解壓縮數(shù)據(jù)?
- class lzma.LZMACompressor(format=FORMAT_XZ, check=- 1, preset=None, filters=None)?
創(chuàng)建一個壓縮器對象,此對象可被用來執(zhí)行增量壓縮。
壓縮單個數(shù)據(jù)塊的更便捷方式請參閱
compress()
。format 參數(shù)指定應當使用哪種容器格式。 可能的值有:
FORMAT_XZ
:.xz
容器格式。這是默認格式。
FORMAT_ALONE
: 傳統(tǒng)的.lzma
容器格式。這種格式相比
.xz
更為受限 -- 它不支持一致性檢查或多重過濾器。
FORMAT_RAW
: A raw data stream, not using sequences format.這個格式描述器不支持一致性檢查,并且要求你必須指定一個自定義的過濾器鏈(用于壓縮和解壓縮)。 此外,以這種方式壓縮的數(shù)據(jù)不可使用
FORMAT_AUTO
來解壓縮 (參見LZMADecompressor
)。
check 參數(shù)指定要包含在壓縮數(shù)據(jù)中的一致性檢查類型。 這種檢查在解壓縮時使用,以確保數(shù)據(jù)沒有被破壞。 可能的值是:
CHECK_NONE
: 沒有一致性檢查。 這是FORMAT_ALONE
和FORMAT_RAW
的默認值(也是唯一可接受的值)。CHECK_CRC32
: 32 位循環(huán)冗余檢查。CHECK_CRC64
: 64 位循環(huán)冗余檢查。 這是FORMAT_XZ
的默認值。CHECK_SHA256
: 256 位安全哈希算法。
如果指定的檢查不受支持,則會引發(fā)
LZMAError
。壓縮設置可被指定為一個預設的壓縮等級(通過 preset 參數(shù))或以自定義過濾器鏈來詳細設置(通過 filters 參數(shù))。
preset 參數(shù)(如果提供)應當為一個
0
到9
(包括邊界) 之間的整數(shù),可以選擇與常數(shù)PRESET_EXTREME
進行 OR 運算。 如果 preset 和 filters 均未給出,則默認行為是使用PRESET_DEFAULT
(預設等級6
)。 更高的預設等級會產(chǎn)生更小的輸出,但會使得壓縮過程更緩慢。備注
除了更加 CPU 密集,使用更高的預設等級來壓縮還需要更多的內(nèi)存(并產(chǎn)生需要更多內(nèi)存來解壓縮的輸出)。 例如使用預設等級
9
時,一個LZMACompressor
對象的開銷可以高達 800 MiB。 出于這樣的原因,通常最好是保持使用默認預設等級。filters 參數(shù)(如果提供)應當指定一個過濾器鏈。 詳情參見 指定自定義的過濾器鏈。
- compress(data)?
壓縮 data (一個
bytes
object),返回包含針對輸入的至少一部分已壓縮數(shù)據(jù)的bytes
對象。 一部 data 可能會被放入內(nèi)部緩沖區(qū),以便用于后續(xù)的compress()
和flush()
調(diào)用。 返回的數(shù)據(jù)應當與之前任何compress()
調(diào)用的輸出進行拼接。
- class lzma.LZMADecompressor(format=FORMAT_AUTO, memlimit=None, filters=None)?
創(chuàng)建一個壓縮器對象,此對象可被用來執(zhí)行增量解壓縮。
一次性解壓縮整個壓縮數(shù)據(jù)流的更便捷方式請參閱
decompress()
。format 參數(shù)指定應當被使用的容器格式。 默認值為
FORMAT_AUTO
,它可以解壓縮.xz
和.lzma
文件。 其他可能的值為FORMAT_XZ
,FORMAT_ALONE
和FORMAT_RAW
。memlimit 參數(shù)指定解壓縮器可以使用的內(nèi)存上限(字節(jié)數(shù))。 當使用此參數(shù)時,如果不可能在給定內(nèi)存上限之內(nèi)解壓縮輸入數(shù)據(jù)則解壓縮將失敗并引發(fā)
LZMAError
。filters 參數(shù)指定用于創(chuàng)建被解壓縮數(shù)據(jù)流的過濾器鏈。 此參數(shù)在 format 為
FORMAT_RAW
時要求提供,但對于其他格式不應使用。 有關(guān)過濾器鏈的更多信息請參閱 指定自定義的過濾器鏈。備注
這個類不會透明地處理包含多個已壓縮數(shù)據(jù)流的輸入,這不同于
decompress()
和LZMAFile
。 要通過LZMADecompressor
來解壓縮多個數(shù)據(jù)流輸入,你必須為每個數(shù)據(jù)流都創(chuàng)建一個新的解壓縮器。- decompress(data, max_length=- 1)?
解壓縮 data (一個 bytes-like object),返回字節(jié)串形式的解壓縮數(shù)據(jù)。 某些 data 可以在內(nèi)部被緩沖,以便用于后續(xù)的
decompress()
調(diào)用。 返回的數(shù)據(jù)應當與之前任何decompress()
調(diào)用的輸出進行拼接。如果 max_length 為非負數(shù),將返回至多 max_length 個字節(jié)的解壓縮數(shù)據(jù)。 如果達到此限制并且可以產(chǎn)生后續(xù)輸出,則
needs_input
屬性將被設為False
。 在這種情況下,下一次decompress()
調(diào)用提供的 data 可以為b''
以獲取更多的輸出。如果所有輸入數(shù)據(jù)都已被解壓縮并返回(或是因為它少于 max_length 個字節(jié),或是因為 max_length 為負數(shù)),則
needs_input
屬性將被設為True
。在到達數(shù)據(jù)流末尾之后再嘗試解壓縮數(shù)據(jù)會引發(fā) EOFError。 在數(shù)據(jù)流末尾之后獲取的任何數(shù)據(jù)都會被忽略并存儲至
unused_data
屬性。在 3.5 版更改: 添加了 max_length 形參。
- check?
輸入流使用的一致性檢查的 ID。 這可能為
CHECK_UNKNOWN
直到已解壓了足夠的輸入數(shù)據(jù)來確定它所使用的一致性檢查。
- eof?
若達到了數(shù)據(jù)流的末尾標記則為
True
。
- unused_data?
在壓縮數(shù)據(jù)流的末尾之后獲取的數(shù)據(jù)。
在達到數(shù)據(jù)流末尾之前,這個值將為
b""
。
- needs_input?
如果在要求新的未解壓縮輸入之前
decompress()
方法可以提供更多的解壓縮數(shù)據(jù)則為False
。3.5 新版功能.
- lzma.compress(data, format=FORMAT_XZ, check=- 1, preset=None, filters=None)?
壓縮 data (一個
bytes
對象),返回包含壓縮數(shù)據(jù)的bytes
對象。參見上文的
LZMACompressor
了解有關(guān) format, check, preset 和 filters 參數(shù)的說明。
- lzma.decompress(data, format=FORMAT_AUTO, memlimit=None, filters=None)?
解壓縮 data (一個
bytes
對象),返回包含解壓縮數(shù)據(jù)的bytes
對象。如果 data 是多個單獨壓縮數(shù)據(jù)流的拼接,則解壓縮所有相應數(shù)據(jù)流,并返回結(jié)果的拼接。
參見上文的
LZMADecompressor
了解有關(guān) format, memlimit 和 filters 參數(shù)的說明。
雜項?
- lzma.is_check_supported(check)?
如果本系統(tǒng)支持給定的一致性檢查則返回
True
。CHECK_NONE
和CHECK_CRC32
總是受支持。CHECK_CRC64
和CHECK_SHA256
或許不可用,如果你正在使用基于受限制特性集編譯的 liblzma 版本的話。
指定自定義的過濾器鏈?
過濾器鏈描述符是由字典組成的序列,其中每個字典包含單個過濾器的 ID 和選項。 每個字典必須包含鍵 "id"
,并可能包含額外的鍵用來指定基于過濾器的選項。 有效的過濾器 ID 如下:
- 壓縮過濾器:
FILTER_LZMA1
(配合FORMAT_ALONE
使用)FILTER_LZMA2
(配合FORMAT_XZ
和FORMAT_RAW
使用)
- Delta 過濾器:
FILTER_DELTA
- Branch-Call-Jump (BCJ) 過濾器:
FILTER_X86
FILTER_IA64
FILTER_ARM
FILTER_ARMTHUMB
FILTER_POWERPC
FILTER_SPARC
一個過濾器鏈最多可由 4 個過濾器組成,并且不能為空。 過濾器鏈中的最后一個過濾器必須為壓縮過濾器,其他過濾器必須為 Delta 或 BCJ 過濾器。
壓縮過濾器支持下列選項(指定為表示過濾器的字典中的附加條目):
preset
: 壓縮預設選項,用于作為未顯式指定的選項的默認值的來源。
dict_size
: 以字節(jié)表示的字典大小。 這應當在 4 KiB 和 1.5 GiB 之間(包含邊界)。
lc
: 字面值上下文的比特數(shù)。
lp
: 字面值位置的比特數(shù)。 總計值lc + lp
必須不大于 4。
pb
: 位置的比特數(shù);必須不大于 4。
mode
:MODE_FAST
或MODE_NORMAL
。
nice_len
: 對于一個匹配應當被視為“適宜長度”的值。 這應當小于或等于 273。
mf
: 要使用的匹配查找器 --MF_HC3
,MF_HC4
,MF_BT2
,MF_BT3
或MF_BT4
。
depth
: 匹配查找器使用的最大查找深度。 0 (默認值) 表示基于其他過濾器選項自動選擇。
Delta 過濾器保存字節(jié)數(shù)據(jù)之間的差值,在特定環(huán)境下可產(chǎn)生更具重復性的輸入。 它支持一個 dist
選項,指明要減去的字節(jié)之間的差值大小。 默認值為 1,即相鄰字節(jié)之間的差值。
BCJ 過濾器主要作用于機器碼。 它們會轉(zhuǎn)換機器碼內(nèi)的相對分支、調(diào)用和跳轉(zhuǎn)以使用絕對尋址,其目標是提升冗余度以供壓縮器利用。 這些過濾器支持一個 start_offset
選項,指明應當被映射到輸入數(shù)據(jù)開頭的地址。 默認值為 0。
例子?
在已壓縮的數(shù)據(jù)中讀取:
import lzma
with lzma.open("file.xz") as f:
file_content = f.read()
創(chuàng)建一個壓縮文件:
import lzma
data = b"Insert Data Here"
with lzma.open("file.xz", "w") as f:
f.write(data)
在內(nèi)存中壓縮文件:
import lzma
data_in = b"Insert Data Here"
data_out = lzma.compress(data_in)
增量壓縮:
import lzma
lzc = lzma.LZMACompressor()
out1 = lzc.compress(b"Some data\n")
out2 = lzc.compress(b"Another piece of data\n")
out3 = lzc.compress(b"Even more data\n")
out4 = lzc.flush()
# Concatenate all the partial results:
result = b"".join([out1, out2, out3, out4])
寫入已壓縮數(shù)據(jù)到已打開的文件:
import lzma
with open("file.xz", "wb") as f:
f.write(b"This data will not be compressed\n")
with lzma.open(f, "w") as lzf:
lzf.write(b"This *will* be compressed\n")
f.write(b"Not compressed\n")
使用自定義過濾器鏈創(chuàng)建一個已壓縮文件:
import lzma
my_filters = [
{"id": lzma.FILTER_DELTA, "dist": 5},
{"id": lzma.FILTER_LZMA2, "preset": 7 | lzma.PRESET_EXTREME},
]
with lzma.open("file.xz", "w", filters=my_filters) as f:
f.write(b"blah blah blah")