bz2 --- 對 bzip2 壓縮算法的支持?
源代碼: Lib/bz2.py
此模塊提供了使用 bzip2 壓縮算法壓縮和解壓數據的一套完整的接口。
bz2 模塊包含:
用于增量壓縮和解壓的
BZ2Compressor和BZ2Decompressor類。用于一次性壓縮和解壓的
compress()和decompress()函數。
此模塊中的所有類都能安全地從多個線程訪問。
文件壓縮和解壓?
-
bz2.open(filename, mode='r', compresslevel=9, encoding=None, errors=None, newline=None)? 以二進制或文本模式打開 bzip2 壓縮文件,返回一個 file object。
和
BZ2File的構造函數類似,filename 參數可以是一個實際的文件名(str或bytes對象),或是已有的可供讀取或寫入的文件對象。mode 參數可設為二進制模式的
'r'、'rb'、'w'、'wb'、'x'、'xb'、'a'或'ab',或者文本模式的'rt'、'wt'、'xt'或'at'。默認是'rb'。compresslevel 參數是 1 到 9 的整數,和
BZ2File的構造函數一樣。對于二進制模式,這個函數等價于
BZ2File構造器:BZ2File(filename, mode, compresslevel=compresslevel)。 在這種情況下,不可提供 encoding, errors 和 newline 參數。對于文本模式,將會創(chuàng)建一個
BZ2File對象,并將它包裝到一個io.TextIOWrapper實例中,此實例帶有指定的編碼格式、錯誤處理行為和行結束符。3.3 新版功能.
在 3.4 版更改: 添加了
'x'(僅創(chuàng)建) 模式。在 3.6 版更改: 接受一個 path-like object。
-
class
bz2.BZ2File(filename, mode='r', buffering=None, compresslevel=9)? 用二進制模式打開 bzip2 壓縮文件。
如果 filename 是一個
str或bytes對象,則打開名稱對應的文件目錄。 否則的話,filename 應當是一個 file object,它將被用來讀取或寫入壓縮數據。mode 參數可以是表示讀取的
'r'(默認值),表示覆寫的'w',表示單獨創(chuàng)建的'x',或表示添加的'a'。 這些模式還可別以'rb','wb','xb'和'ab'的等價形式給出。如果 filename 是一個文件對象(而不是實際的文件名),則
'w'模式并不會截斷文件,而是會等價于'a'。buffering 參數會被忽略。 它已經被棄用。
如果 mode 為
'w'或'a',則 compresslevel 可以是1到9之間的整數,用于指定壓縮等級:1產生最低壓縮率,而9(默認值) 產生最高壓縮率。如果 mode 為
'r',則輸入文件可以為多個壓縮流的拼接。BZ2File提供了io.BufferedIOBase所指定的所有成員,但detach()和truncate()除外。 并支持迭代和with語句。BZ2File還提供了以下方法:-
peek([n])? 返回緩沖的數據而不前移文件位置。 至少將返回一個字節(jié)的數據(除非為 EOF)。 實際返回的字節(jié)數不確定。
3.3 新版功能.
在 3.1 版更改: 支持了
with語句。在 3.3 版更改: 添加了
fileno(),readable(),seekable(),writable(),read1()和readinto()方法。在 3.3 版更改: 添加了對 filename 使用 file object 而非實際文件名的支持。
在 3.3 版更改: 添加了
'a'(append) 模式,以及對讀取多數據流文件的支持。在 3.4 版更改: 添加了
'x'(僅創(chuàng)建) 模式。在 3.5 版更改:
read()方法現(xiàn)在接受None作為參數。在 3.6 版更改: 接受一個 path-like object。
-
增量壓縮和解壓?
-
class
bz2.BZ2Compressor(compresslevel=9)? 創(chuàng)建一個新的壓縮器對象。 此對象可被用來執(zhí)行增量數據壓縮。 對于一次性壓縮,請改用
compress()函數。如果給定 compresslevel,它必須為
1至9之間的整數。 默認值為9。-
flush()? 結束壓縮進程,返回內部緩沖中剩余的壓縮完成的數據。
調用此方法之后壓縮器對象將不可再被使用。
-
-
class
bz2.BZ2Decompressor? 創(chuàng)建一個新的解壓縮器對象。 此對象可被用來執(zhí)行增量數據解壓縮。 對于一次性解壓縮,請改用
decompress()函數。注解
這個類不會透明地處理包含多個已壓縮數據流的輸入,這不同于
decompress()和BZ2File。 如果你需要通過BZ2Decompressor來解壓縮多個數據流輸入,你必須為每個數據流都使用新的解壓縮器。-
decompress(data, max_length=-1)? 解壓縮 data (一個 bytes-like object),返回字節(jié)串形式的解壓縮數據。 某些 data 可以在內部被緩沖,以便用于后續(xù)的
decompress()調用。 返回的數據應當與之前任何decompress()調用的輸出進行拼接。如果 max_length 為非負數,將返回至多 max_length 個字節(jié)的解壓縮數據。 如果達到此限制并且可以產生后續(xù)輸出,則
needs_input屬性將被設為False。 在這種情況下,下一次decompress()調用提供的 data 可以為b''以獲取更多的輸出。如果所有輸入數據都已被解壓縮并返回(或是因為它少于 max_length 個字節(jié),或是因為 max_length 為負數),則
needs_input屬性將被設為True。在到達數據流末尾之后再嘗試解壓縮數據會引發(fā) EOFError。 在數據流末尾之后獲取的任何數據都會被忽略并存儲至
unused_data屬性。在 3.5 版更改: 添加了 max_length 形參。
-
eof? 若達到了數據流末尾標識符則為
True。3.3 新版功能.
-
unused_data? 壓縮數據流的末尾還有數據。
如果在達到數據流末尾之前訪問此屬性,其值將為
b''。
-
needs_input? 如果在要求新的未解壓縮輸入之前
decompress()方法可以提供更多的解壓縮數據則為False。3.5 新版功能.
-
一次性壓縮或解壓?
-
bz2.compress(data, compresslevel=9)? 壓縮 data,此參數為一個 字節(jié)類對象。
如果給定 compresslevel,它必須為
1至9之間的整數。 默認值為9。對于增量壓縮,請改用
BZ2Compressor。
-
bz2.decompress(data)? 解壓縮 data,此參數為一個 字節(jié)類對象。
如果 data 是多個壓縮數據流的拼接,則解壓縮所有數據流。
對于增量解壓縮,請改用
BZ2Decompressor。在 3.3 版更改: 支持了多數據流的輸入。
用法示例?
以下是 bz2 模塊典型用法的一些示例。
使用 compress() 和 decompress() 來顯示往復式的壓縮:
>>> import bz2
>>> data = b"""\
... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue
... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem,
... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus
... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat.
... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo
... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum
... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum."""
>>> c = bz2.compress(data)
>>> len(data) / len(c) # Data compression ratio
1.513595166163142
>>> d = bz2.decompress(c)
>>> data == d # Check equality to original object after round-trip
True
使用 BZ2Compressor 進行增量壓縮:
>>> import bz2
>>> def gen_data(chunks=10, chunksize=1000):
... """Yield incremental blocks of chunksize bytes."""
... for _ in range(chunks):
... yield b"z" * chunksize
...
>>> comp = bz2.BZ2Compressor()
>>> out = b""
>>> for chunk in gen_data():
... # Provide data to the compressor object
... out = out + comp.compress(chunk)
...
>>> # Finish the compression process. Call this once you have
>>> # finished providing data to the compressor.
>>> out = out + comp.flush()
上面的示例使用了十分“非隨機”的數據流(即 b"z" 塊數據流)。 隨機數據的壓縮率通常很差,而有序、重復的數據通常會產生很高的壓縮率。
用二進制模式寫入和讀取 bzip2 壓縮文件:
>>> import bz2
>>> data = b"""\
... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue
... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem,
... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus
... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat.
... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo
... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum
... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum."""
>>> with bz2.open("myfile.bz2", "wb") as f:
... # Write compressed data to file
... unused = f.write(data)
>>> with bz2.open("myfile.bz2", "rb") as f:
... # Decompress data from file
... content = f.read()
>>> content == data # Check equality to original object after round-trip
True
