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