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