bz2 --- 對 bzip2 壓縮算法的支持?

源代碼: Lib/bz2.py


此模塊提供了使用 bzip2 壓縮算法壓縮和解壓數(shù)據(jù)的一套完整的接口。

bz2 模塊包含:

文件壓縮和解壓?

bz2.open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)?

以二進制或文本模式打開 bzip2 壓縮文件,返回一個 file object。

BZ2File 的構(gòu)造函數(shù)類似,filename 參數(shù)可以是一個實際的文件名(strbytes 對象),或是已有的可供讀取或?qū)懭氲奈募ο蟆?/p>

mode 參數(shù)可設(shè)為二進制模式的 'r'、'rb'、'w'、'wb'、'x'、'xb''a''ab',或者文本模式的 'rt''wt'、'xt''at'。默認(rèn)是 'rb'。

compresslevel 參數(shù)是 1 到 9 的整數(shù),和 BZ2File 的構(gòu)造函數(shù)一樣。

對于二進制模式,這個函數(shù)等價于 BZ2File 構(gòu)造器: BZ2File(filename, mode, compresslevel=compresslevel)。 在這種情況下,不可提供 encoding, errorsnewline 參數(shù)。

對于文本模式,將會創(chuàng)建一個 BZ2File 對象,并將它包裝到一個 io.TextIOWrapper 實例中,此實例帶有指定的編碼格式、錯誤處理行為和行結(jié)束符。

3.3 新版功能.

在 3.4 版更改: 添加了 'x' (單獨創(chuàng)建) 模式。

在 3.6 版更改: 接受一個 path-like object。

class bz2.BZ2File(filename, mode='r', *, compresslevel=9)?

用二進制模式打開 bzip2 壓縮文件。

如果 filename 是一個 strbytes 對象,則打開名稱對應(yīng)的文件目錄。 否則的話,filename 應(yīng)當(dāng)是一個 file object,它將被用來讀取或?qū)懭雺嚎s數(shù)據(jù)。

mode 參數(shù)可以是表示讀取的 'r' (默認(rèn)值),表示覆寫的 'w',表示單獨創(chuàng)建的 'x',或表示添加的 'a'。 這些模式還可分別以 'rb', 'wb', 'xb''ab' 的等價形式給出。

如果 filename 是一個文件對象(而不是實際的文件名),則 'w' 模式并不會截斷文件,而是會等價于 'a'

如果 mode'w''a',則 compresslevel 可以是 19 之間的整數(shù),用于指定壓縮等級: 1 產(chǎn)生最低壓縮率,而 9 (默認(rèn)值) 產(chǎn)生最高壓縮率。

如果 mode'r',則輸入文件可以為多個壓縮流的拼接。

BZ2File 提供了 io.BufferedIOBase 所指定的所有成員,但 detach()truncate() 除外。 并支持迭代和 with 語句。

BZ2File 還提供了以下方法:

peek([n])?

返回緩沖的數(shù)據(jù)而不前移文件位置。 至少將返回一個字節(jié)的數(shù)據(jù)(除非為 EOF)。 實際返回的字節(jié)數(shù)不確定。

備注

雖然調(diào)用 peek() 不會改變 BZ2File 的文件位置,但它可能改變下層文件對象的位置(舉例來說如果 BZ2File 是通過傳入一個文件對象作為 filename 的話)。

3.3 新版功能.

在 3.1 版更改: 添加了對 with 語句的支持。

在 3.3 版更改: 添加了 fileno(), readable(), seekable(), writable(), read1()readinto() 方法。

在 3.3 版更改: 添加了對 filename 使用 file object 而非實際文件名的支持。

在 3.3 版更改: 添加了 'a' (append) 模式,以及對讀取多數(shù)據(jù)流文件的支持。

在 3.4 版更改: 添加了 'x' (單獨創(chuàng)建) 模式。

在 3.5 版更改: read() 方法現(xiàn)在接受 None 作為參數(shù)。

在 3.6 版更改: 接受一個 path-like object。

在 3.9 版更改: buffering 形參已被移除。 它自 Python 3.0 起即被忽略并棄用。 請傳入一個打開文件對象來控制文件的打開方式。

compresslevel 形參成為僅限關(guān)鍵字參數(shù)。

在 3.10 版更改: 這個類在面對多個同時讀取器和寫入器時是線程安全的,就如它在 gziplzma 中的等價類所具有的特性一樣。

增量壓縮和解壓?

class bz2.BZ2Compressor(compresslevel=9)?

創(chuàng)建一個新的壓縮器對象。 此對象可被用來執(zhí)行增量數(shù)據(jù)壓縮。 對于一次性壓縮,請改用 compress() 函數(shù)。

如果給定 compresslevel,它必須為 19 之間的整數(shù)。 默認(rèn)值為 9。

compress(data)?

向壓縮器對象提供數(shù)據(jù)。 在可能的情況下返回一段已壓縮數(shù)據(jù),否則返回空字節(jié)串。

當(dāng)你已結(jié)束向壓縮器提供數(shù)據(jù)時,請調(diào)用 flush() 方法來完成壓縮進程。

flush()?

結(jié)束壓縮進程,返回內(nèi)部緩沖中剩余的壓縮完成的數(shù)據(jù)。

調(diào)用此方法之后壓縮器對象將不可再被使用。

class bz2.BZ2Decompressor?

創(chuàng)建一個新的解壓縮器對象。 此對象可被用來執(zhí)行增量數(shù)據(jù)解壓縮。 對于一次性解壓縮,請改用 decompress() 函數(shù)。

備注

這個類不會透明地處理包含多個已壓縮數(shù)據(jù)流的輸入,這不同于 decompress()BZ2File。 如果你需要通過 BZ2Decompressor 來解壓縮多個數(shù)據(jù)流輸入,你必須為每個數(shù)據(jù)流都使用新的解壓縮器。

decompress(data, max_length=- 1)?

解壓縮 data (一個 bytes-like object),返回字節(jié)串形式的解壓縮數(shù)據(jù)。 某些 data 可以在內(nèi)部被緩沖,以便用于后續(xù)的 decompress() 調(diào)用。 返回的數(shù)據(jù)應(yīng)當(dāng)與之前任何 decompress() 調(diào)用的輸出進行拼接。

如果 max_length 為非負(fù)數(shù),將返回至多 max_length 個字節(jié)的解壓縮數(shù)據(jù)。 如果達到此限制并且可以產(chǎn)生后續(xù)輸出,則 needs_input 屬性將被設(shè)為 False。 在這種情況下,下一次 decompress() 調(diào)用提供的 data 可以為 b'' 以獲取更多的輸出。

如果所有輸入數(shù)據(jù)都已被解壓縮并返回(或是因為它少于 max_length 個字節(jié),或是因為 max_length 為負(fù)數(shù)),則 needs_input 屬性將被設(shè)為 True

在到達數(shù)據(jù)流末尾之后再嘗試解壓縮數(shù)據(jù)會引發(fā) EOFError。 在數(shù)據(jù)流末尾之后獲取的任何數(shù)據(jù)都會被忽略并存儲至 unused_data 屬性。

在 3.5 版更改: 添加了 max_length 形參。

eof?

若達到了數(shù)據(jù)流的末尾標(biāo)記則為 True。

3.3 新版功能.

unused_data?

在壓縮數(shù)據(jù)流的末尾之后獲取的數(shù)據(jù)。

如果在達到數(shù)據(jù)流末尾之前訪問此屬性,其值將為 b''。

needs_input?

如果在要求新的未解壓縮輸入之前 decompress() 方法可以提供更多的解壓縮數(shù)據(jù)則為 False

3.5 新版功能.

一次性壓縮或解壓縮?

bz2.compress(data, compresslevel=9)?

壓縮 data,此參數(shù)為一個 字節(jié)類對象。

如果給定 compresslevel,它必須為 19 之間的整數(shù)。 默認(rèn)值為 9。

對于增量壓縮,請改用 BZ2Compressor

bz2.decompress(data)?

解壓縮 data,此參數(shù)為一個 字節(jié)類對象

如果 data 是多個壓縮數(shù)據(jù)流的拼接,則解壓縮所有數(shù)據(jù)流。

對于增量解壓縮,請改用 BZ2Decompressor。

在 3.3 版更改: 支持了多數(shù)據(jù)流的輸入。

用法示例?

以下是 bz2 模塊典型用法的一些示例。

使用 compress()decompress() 來顯示往復(fù)式的壓縮:

>>>
>>> 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()

上面的示例使用了十分“非隨機”的數(shù)據(jù)流(即 b"z" 塊數(shù)據(jù)流)。 隨機數(shù)據(jù)的壓縮率通常很差,而有序、重復(fù)的數(shù)據(jù)通常會產(chǎn)生很高的壓縮率。

用二進制模式寫入和讀取 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