lzma — LZMAアルゴリズムを使用した圧縮—Pythonドキュメント

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

lzma —LZMAアルゴリズムを使用した圧縮

バージョン3.3の新機能。


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



このモジュールは、LZMA圧縮アルゴリズムを使用してデータを圧縮および解凍するためのクラスと便利な関数を提供します。 また、.xzおよび xz ユーティリティで使用されるレガシー.lzmaファイル形式、および生の圧縮ストリームをサポートするファイルインターフェイスも含まれています。

このモジュールが提供するインターフェースは、 bz2 モジュールのインターフェースと非常によく似ています。 ただし、 LZMAFile は、 bz2.BZ2File とは異なり、スレッドセーフではないことに注意してください。したがって、単一の LZMAFile インスタンスを使用する必要がある場合複数のスレッドから、ロックで保護する必要があります。

exception lzma.LZMAError
この例外は、圧縮または解凍中、またはコンプレッサー/デコンプレッサーの状態の初期化中にエラーが発生した場合に発生します。

圧縮ファイルの読み取りと書き込み

lzma.open(filename, mode='rb', *, format=None, check=- 1, preset=None, filters=None, encoding=None, errors=None, newline=None)

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

filename 引数は、実際のファイル名( strbytes 、または path-like オブジェクトとして指定)のいずれかです。指定されたファイルが開かれている場合、または読み取りまたは書き込みを行う既存のファイルオブジェクトである可能性があります。

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

読み取り用にファイルを開く場合、 format および filters 引数は、 LZMADecompressor と同じ意味を持ちます。 この場合、 check および preset 引数は使用しないでください。

書き込み用にファイルを開く場合、形式チェックプリセットフィルター引数の意味は LZMACompressorと同じです。

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

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

バージョン3.4で変更: "x""xb"、および"xt"モードのサポートが追加されました。

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

class lzma.LZMAFile(filename=None, mode='r', *, format=None, check=- 1, preset=None, filters=None)

LZMA圧縮ファイルをバイナリモードで開きます。

LZMAFile は、すでに開いているファイルオブジェクトをラップすることも、名前付きファイルを直接操作することもできます。 filename 引数は、ラップするファイルオブジェクト、または開くファイルの名前( strbytes 、または pathのようなもの)を指定します。 オブジェクト)。 既存のファイルオブジェクトをラップする場合、 LZMAFile を閉じてもラップされたファイルは閉じられません。

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

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

読み取り用にファイルを開く場合、入力ファイルは複数の個別の圧縮ストリームを連結したものである場合があります。 これらは、単一の論理ストリームとして透過的にデコードされます。

読み取り用にファイルを開く場合、 format および filters 引数は、 LZMADecompressor と同じ意味を持ちます。 この場合、 check および preset 引数は使用しないでください。

書き込み用にファイルを開く場合、形式チェックプリセットフィルター引数の意味は LZMACompressorと同じです。

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

次の方法も提供されます。

peek(size=- 1)

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

ノート

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

バージョン3.4で変更: "x"および"xb"モードのサポートが追加されました。

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

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


メモリ内のデータの圧縮と解凍

class lzma.LZMACompressor(format=FORMAT_XZ, check=- 1, preset=None, filters=None)

データを段階的に圧縮するために使用できるコンプレッサーオブジェクトを作成します。

データの単一チャンクを圧縮するより便利な方法については、 compress()を参照してください。

format 引数は、使用するコンテナー形式を指定します。 可能な値は次のとおりです。

  • FORMAT_XZ.xzコンテナ形式。

    これがデフォルトの形式です。

  • FORMAT_ALONE:従来の.lzmaコンテナ形式。

    この形式は.xzよりも制限されており、整合性チェックや複数のフィルターをサポートしていません。

  • FORMAT_RAW:コンテナ形式を使用しない生データストリーム。

    この形式指定子は整合性チェックをサポートしていないため、常にカスタムフィルターチェーンを指定する必要があります(圧縮と解凍の両方)。 さらに、この方法で圧縮されたデータは、FORMAT_AUTOを使用して解凍することはできません( LZMADecompressor を参照)。

check 引数は、圧縮データに含める整合性チェックのタイプを指定します。 このチェックは、データが破損していないことを確認するために、解凍時に使用されます。 可能な値は次のとおりです。

  • CHECK_NONE:整合性チェックはありません。 これは、FORMAT_ALONEおよびFORMAT_RAWのデフォルト(および唯一の許容値)です。

  • CHECK_CRC32:32ビットの巡回冗長検査。

  • CHECK_CRC64:64ビットの巡回冗長検査。 これはFORMAT_XZのデフォルトです。

  • CHECK_SHA256:256ビットのセキュアハッシュアルゴリズム。

指定されたチェックがサポートされていない場合、 LZMAError が発生します。

圧縮設定は、プリセット圧縮レベル(プリセット引数を使用)として、または詳細にカスタムフィルターチェーン(フィルター引数を使用)として指定できます。

プリセット引数(指定されている場合)は、09(両端を含む)の間の整数である必要があり、オプションで定数PRESET_EXTREMEとOR演算されます。 プリセットフィルターも指定されていない場合、デフォルトの動作ではPRESET_DEFAULT(プリセットレベル6)が使用されます。 プリセットを高くすると出力は小さくなりますが、圧縮プロセスは遅くなります。

ノート

CPUを集中的に使用することに加えて、プリセットを高くして圧縮すると、はるかに多くのメモリが必要になります(また、解凍するためにより多くのメモリを必要とする出力が生成されます)。 たとえば、プリセット9の場合、 LZMACompressor オブジェクトのオーバーヘッドは最大800MiBになる可能性があります。 このため、通常はデフォルトのプリセットを使用するのが最善です。

filters 引数(指定されている場合)は、フィルターチェーン指定子である必要があります。 詳細については、カスタムフィルターチェーンの指定を参照してください。

compress(data)

databytes オブジェクト)を圧縮し、入力の少なくとも一部の圧縮データを含む bytes オブジェクトを返します。 データの一部は、後で compress()および flush()を呼び出すときに使用するために、内部でバッファリングされる場合があります。 返されるデータは、 compress()への以前の呼び出しの出力と連結する必要があります。

flush()

圧縮プロセスを終了し、コンプレッサーの内部バッファーに格納されているデータを含む bytes オブジェクトを返します。

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

class lzma.LZMADecompressor(format=FORMAT_AUTO, memlimit=None, filters=None)

データを段階的に解凍するために使用できる解凍オブジェクトを作成します。

圧縮されたストリーム全体を一度に解凍するより便利な方法については、 decompress()を参照してください。

format 引数は、使用する必要のあるコンテナー形式を指定します。 デフォルトはFORMAT_AUTOで、.xzファイルと.lzmaファイルの両方を解凍できます。 その他の可能な値は、FORMAT_XZFORMAT_ALONE、およびFORMAT_RAWです。

memlimit 引数は、デコンプレッサが使用できるメモリ量の制限(バイト単位)を指定します。 この引数を使用すると、指定されたメモリ制限内で入力を解凍できない場合、解凍は LZMAError で失敗します。

filters 引数は、解凍されるストリームの作成に使用されたフィルターチェーンを指定します。 この引数は、 formatFORMAT_RAWの場合に必要ですが、他のフォーマットには使用しないでください。 フィルタチェーンの詳細については、カスタムフィルタチェーンの指定を参照してください。

ノート

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

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 パラメーターが追加されました。

check

入力ストリームによって使用される整合性チェックのID。 これは、使用する整合性チェックを決定するのに十分な入力がデコードされるまで、CHECK_UNKNOWNになる可能性があります。

eof

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

unused_data

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

ストリームの終わりに達する前は、これはb""になります。

needs_input

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

バージョン3.5の新機能。

lzma.compress(data, format=FORMAT_XZ, check=- 1, preset=None, filters=None)

databytes オブジェクト)を圧縮し、圧縮されたデータを bytes オブジェクトとして返します。

フォーマットチェックプリセットおよびフィルター引数の説明については、上記の LZMACompressor を参照してください。

lzma.decompress(data, format=FORMAT_AUTO, memlimit=None, filters=None)

databytes オブジェクト)を解凍し、圧縮されていないデータを bytes オブジェクトとして返します。

data が複数の別個の圧縮ストリームの連結である場合、これらのストリームをすべて解凍し、結果の連結を返します。

formatmemlimit 、および filters 引数の説明については、上記の LZMADecompressor を参照してください。


その他

lzma.is_check_supported(check)

指定された整合性チェックがこのシステムでサポートされている場合は、Trueを返します。

CHECK_NONEおよびCHECK_CRC32は常にサポートされています。 限られた機能セットでコンパイルされたバージョンの liblzma を使用している場合、CHECK_CRC64およびCHECK_SHA256が使用できない場合があります。


カスタムフィルターチェーンの指定

フィルタチェーン指定子は一連のディクショナリであり、各ディクショナリには単一のフィルタのIDとオプションが含まれています。 各辞書にはキー"id"が含まれている必要があり、フィルターに依存するオプションを指定するための追加のキーが含まれている場合があります。 有効なフィルターIDは次のとおりです。

  • *; 圧縮フィルター:
    *;* FILTER_LZMA1FORMAT_ALONEで使用)
    • FILTER_LZMA2FORMAT_XZおよびFORMAT_RAWで使用)
  • *; デルタフィルター:
    *;* FILTER_DELTA
  • *; Branch-Call-Jump(BCJ)フィルター:
    *;* FILTER_X86
    • FILTER_IA64
    • FILTER_ARM
    • FILTER_ARMTHUMB
    • FILTER_POWERPC
    • FILTER_SPARC

フィルタチェーンは最大4つのフィルタで構成でき、空にすることはできません。 チェーンの最後のフィルターは圧縮フィルターである必要があり、その他のフィルターはデルタまたはBCJフィルターである必要があります。

圧縮フィルターは、次のオプションをサポートします(フィルターを表すディクショナリの追加エントリとして指定)。

  • preset:明示的に指定されていないオプションのデフォルト値のソースとして使用する圧縮プリセット。
  • dict_size:辞書のサイズ(バイト単位)。 これは、4KiBから1.5GiB(両端を含む)である必要があります。
  • lc:リテラルコンテキストビットの数。
  • lp:リテラル位置ビットの数。 合計lc + lpは最大4でなければなりません。
  • pb:位置ビットの数。 最大で4でなければなりません。
  • modeMODE_FASTまたはMODE_NORMAL
  • nice_len:試合の「適切な長さ」と見なされるべきもの。 これは273以下である必要があります。
  • mf:使用するファインダーの一致– MF_HC3MF_HC4MF_BT2MF_BT3、またはMF_BT4
  • depth:マッチファインダーで使用される最大検索深度。 0(デフォルト)は、他のフィルターオプションに基づいて自動的に選択することを意味します。


デルタフィルターはバイト間の差を保存し、特定の状況でコンプレッサーに対してより反復的な入力を生成します。 distという1つのオプションをサポートします。 これは、減算されるバイト間の距離を示します。 デフォルトは1です。つまり、 隣接するバイト間の差を取ります。

BCJフィルターは、マシンコードに適用することを目的としています。 これらは、コンプレッサーが利用できる冗長性を高めることを目的として、コード内の相対的な分岐、呼び出し、およびジャンプを絶対アドレス指定を使用するように変換します。 これらのフィルターは、start_offsetという1つのオプションをサポートします。 これは、入力データの先頭にマップする必要があるアドレスを指定します。 デフォルトは0です。


圧縮ファイルの読み取り:

import lzma
with lzma.open("file.xz") as f:
    file_content = f.read()

圧縮ファイルの作成:

import lzma
data = b"Insert Data Here"
with lzma.open("file.xz", "w") as f:
    f.write(data)

メモリ内のデータの圧縮:

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

すでに開いているファイルへの圧縮データの書き込み:

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

カスタムフィルターチェーンを使用して圧縮ファイルを作成する:

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