bz2 — bzip2圧縮のサポート—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/bz2
移動先:案内検索

bz2 — bzip2 圧縮のサポート

ソースコード: :source: `Lib / bz2.py`



このモジュールは、bzip2圧縮アルゴリズムを使用してデータを圧縮および解凍するための包括的なインターフェースを提供します。

bz2 モジュールには次のものが含まれています。

このモジュールのすべてのクラスは、複数のスレッドから安全にアクセスできます。

ファイルの(解凍)圧縮

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

bzip2で圧縮されたファイルをバイナリモードまたはテキストモードで開き、ファイルオブジェクトを返します。

BZ2File のコンストラクターと同様に、 filename 引数は、実際のファイル名( str または bytes オブジェクト)または既存のファイル名にすることができます。読み取りまたは書き込みを行うファイルオブジェクト。

mode 引数には、'r''rb''w''wb''x''xb''a''ab'、または'rt''wt''xt'、 [X195X ]テキストモードの場合。 デフォルトは'rb'です。

compresslevel 引数は、 BZ2File コンストラクターと同様に、1から9までの整数です。

バイナリモードの場合、この関数は BZ2File コンストラクターBZ2File(filename, mode, compresslevel=compresslevel)と同等です。 この場合、 encodingerrors 、および newline 引数を指定しないでください。

テキストモードの場合、 BZ2File オブジェクトが作成され、指定されたエンコーディング、エラー処理動作、および行末で io.TextIOWrapper インスタンスにラップされます。

バージョン3.3の新機能。

バージョン3.4で変更: 'x'(排他的作成)モードが追加されました。

バージョン3.6で変更: パスのようなオブジェクトを受け入れます。

class bz2.BZ2File(filename, mode='r', buffering=None, compresslevel=9)

bzip2で圧縮されたファイルをバイナリモードで開きます。

filenamestr または bytes オブジェクトの場合は、指定されたファイルを直接開きます。 それ以外の場合、ファイル名ファイルオブジェクトである必要があります。これは、圧縮データの読み取りまたは書き込みに使用されます。

mode 引数は、読み取り用の'r'(デフォルト)、上書き用の'w'、排他的作成用の'x'、または'a'のいずれかです。追加用。 これらは、それぞれ'rb''wb''xb'、および'ab'と同等に指定できます。

filename が(実際のファイル名ではなく)ファイルオブジェクトである場合、'w'のモードはファイルを切り捨てず、代わりに'a'と同等です。

buffering 引数は無視されます。 Python 3.0以降、その使用は非推奨になりました。

mode'w'または'a'の場合、 compresslevel19の間の整数で、圧縮レベル:1は最小の圧縮を生成し、9(デフォルト)は最大の圧縮を生成します。

mode'r'の場合、入力ファイルは複数の圧縮ストリームを連結したものである可能性があります。

BZ2File は、detach()truncate()を除き、 io.BufferedIOBase で指定されたすべてのメンバーを提供します。 反復と with ステートメントがサポートされています。

BZ2File は、次のメソッドも提供します。

peek([n])

ファイルの位置を進めずに、バッファリングされたデータを返します。 少なくとも1バイトのデータが返されます(EOFの場合を除く)。 返される正確なバイト数は指定されていません。

ノート

peek()を呼び出しても、 BZ2File のファイル位置は変更されませんが、基になるファイルオブジェクトの位置は変更される可能性があります(例: BZ2Filefilename のファイルオブジェクトを渡すことによって構築された場合)。

バージョン3.3の新機能。

バージョン3.0以降非推奨:キーワード引数 buffering は非推奨になり、無視されるようになりました。

バージョン3.1で変更: with ステートメントのサポートが追加されました。

バージョン3.3で変更: fileno()readable()seekable()writable()read1()readinto()メソッドが追加されました。

バージョン3.3で変更:実際のファイル名ではなくファイルオブジェクトであるファイル名のサポートが追加されました。

バージョン3.3で変更: 'a'(追加)モードが追加され、マルチストリームファイルの読み取りがサポートされました。

バージョン3.4で変更: 'x'(排他的作成)モードが追加されました。

バージョン3.5で変更: read()メソッドは、Noneの引数を受け入れるようになりました。

バージョン3.6で変更: パスのようなオブジェクトを受け入れます。


インクリメンタル(解凍)圧縮

class bz2.BZ2Compressor(compresslevel=9)

新しいコンプレッサーオブジェクトを作成します。 このオブジェクトは、データを段階的に圧縮するために使用できます。 ワンショット圧縮の場合は、代わりに compress()関数を使用してください。

compresslevel は、指定されている場合、19の間の整数である必要があります。 デフォルトは9です。

compress(data)

コンプレッサーオブジェクトにデータを提供します。 可能であれば圧縮データのチャンクを返し、そうでない場合は空のバイト文字列を返します。

コンプレッサーへのデータの提供が終了したら、 flush()メソッドを呼び出して圧縮プロセスを終了します。

flush()

圧縮プロセスを終了します。 内部バッファに残っている圧縮データを返します。

このメソッドが呼び出された後は、コンプレッサーオブジェクトを使用できません。

class bz2.BZ2Decompressor

新しいデコンプレッサオブジェクトを作成します。 このオブジェクトは、データを段階的に解凍するために使用できます。 ワンショット圧縮の場合は、代わりに decompress()関数を使用してください。

ノート

このクラスは、 decompress()BZ2File とは異なり、複数の圧縮ストリームを含む入力を透過的に処理しません。 BZ2Decompressor を使用してマルチストリーム入力を解凍する必要がある場合は、ストリームごとに新しい解凍ツールを使用する必要があります。

decompress(data, max_length=- 1)

databytes-like object )を解凍し、圧縮されていないデータをバイトとして返します。 データの一部は、後で decompress()を呼び出すときに使用するために、内部でバッファリングされる場合があります。 返されるデータは、 decompress()への以前の呼び出しの出力と連結する必要があります。

max_length が負でない場合、最大で max_length バイトの解凍されたデータを返します。 この制限に達してさらに出力を生成できる場合、 needs_input 属性はFalseに設定されます。 この場合、 decompress()を次に呼び出すと、 databとして提供され、より多くの出力が取得される場合があります。

すべての入力データが解凍されて返された場合(これが max_length バイト未満だったため、または max_length が負だったため)、 needs_input 属性は次のようになります。 Trueに設定します。

ストリームの終わりに達した後にデータを解凍しようとすると、 EOFError が発生します。 ストリームの終了後に見つかったデータはすべて無視され、 unused_data 属性に保存されます。

バージョン3.5で変更: max_length パラメーターが追加されました。

eof

Trueストリームの終わりマーカーに達した場合。

バージョン3.3の新機能。

unused_data

圧縮ストリームの終了後に見つかったデータ。

ストリームの終わりに達する前にこの属性にアクセスすると、その値はbになります。

needs_input

False decompress()メソッドが、新しい非圧縮入力を必要とする前に、より多くの解凍データを提供できる場合。

バージョン3.5の新機能。


ワンショット(解凍)圧縮

bz2.compress(data, compresslevel=9)

データバイトのようなオブジェクトを圧縮します。

compresslevel は、指定されている場合、19の間の整数である必要があります。 デフォルトは9です。

インクリメンタル圧縮の場合は、代わりに BZ2Compressor を使用してください。

bz2.decompress(data)

データバイトのようなオブジェクトを解凍します。

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