Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python(lzma)を使用したLZMAアルゴリズムを使用した圧縮


Lempel–Ziv–Markov連鎖アルゴリズム (LZMA)は、他の圧縮アルゴリズムよりも高い圧縮率を特徴とする辞書圧縮方式を使用して、ロスレスデータ圧縮を実行します。 Pythonのlzmaモジュールは、LZMAアルゴリズムを使用してデータを圧縮および解凍するためのクラスと便利な関数で構成されています。

このモジュールの機能はbz2モジュールの機能と似ていますが、LZMAFileクラスはBZ2Fileクラスと比較してスレッドセーフではありません。

ここでも、lzmaモジュールのopen()関数は、lzmaで圧縮されたファイルオブジェクトを開く最も簡単な方法です。

open()

この関数は、LZMAで圧縮されたファイルを開き、ファイルオブジェクトを返します。この関数には、ファイル名とモードの2つの主要なパラメーターが必要です。モードパラメータはデフォルトで「rb」ですが、次の値のいずれかを取ることができます

binary mode - "r", "rb", "w", "wb", "x", "xb", "a" or "ab"
text mode - "rt", "wt", "xt", or "at"

compress()

この関数は、LZMAアルゴリズムを使用して指定されたデータを圧縮し、バイトオブジェクトを返します。この関数は、オプションで、コンテナー形式を決定する形式引数を使用できます。可能な値は、FORMAT_XZ(デフォルト)およびFORMAT_ALONEです。

decompress()

この関数はデータを解凍し、非圧縮のバイトオブジェクトを返します。

上記の関数は、次の例で使用されます。 LZMA圧縮データをファイルに書き込むには

>>> import lzma
>>> data = b"Welcome to TutorialsPoint"
>>> f = lzma.open("test.xz","wb")
>>>f.write(data)
>>>f.close()

「test.xz」ファイルが現在の作業ディレクトリに作成されます。このファイルから非圧縮データをフェッチするには、次のコードを使用します。

>>> import lzma
>>> f = lzma.open("test.xz","rb")
>>> data = f.read()
>>> data
b'Welcome to TutorialsPoint'

lzmaモジュールのオブジェクト指向APIを使用して圧縮を実行するには、LZMAFileクラスを使用する必要があります

LZMAFile()

これは、LZMAFileクラスのコンストラクターです。ファイルとモードを指定する必要があります。 「w」または「wb」モードのオブジェクトは、write()メソッドを使用できるようにします。

write()

このメソッドは、指定されたデータを圧縮して、その下のファイルに書き込みます。

>>> data = b'Welcome to TutorialsPoint'
>>>obj = lzma.LZMAFile("test.xz", mode="wb")
>>>obj.write(data)
>>>obj.close()

mode =’rb’パラメータで作成されたLZMAFileオブジェクトのread()メソッドによって、圧縮ファイルが読み取られ、非圧縮データが取得されます。

read()

このメソッドは、圧縮ファイルからデータを読み取り、非圧縮データを返します。

>>>obj = lzma.LZMAFile("test.xz", mode="rb")
>>> data=obj.read()
>>> data
b'Welcome to TutorialsPoint'

LZMAアルゴリズムでは、すでに開いているファイルに圧縮データを書き込むこともできます。次の例では、「test.txt」は「wb」モードで通常どおり(組み込みのopen()関数を使用して)開かれ、テキストが書き込まれます。その後、同じファイルを使用して圧縮データを書き込みます。

>>> f = open("test.txt","wb")
>>>f.write(b"Hello world")
>>>fp = lzma.open(f,"wb")
>>>fp.write(b"Welcome to Python")
>>>f.write(b"Thank you")
>>>f.close()
>>>fp.flush()
>>>fp.close()

上記のコードを実行すると、現在のディレクトリに「test.txt」が表示されます。以下のように、圧縮データと非圧縮データが混在しています

Hello worldý7zXZ æÖ´F!t/å£Thank you

bz2モジュールと同様に、lzmaモジュールにもインクリメンタルコンプレッサークラスとデコンプレッサークラスがあります。

LZMACompressor()

これは、インクリメンタルコンプレッサーオブジェクトを返すコンストラクターです。複数のチャンクを個別に圧縮し、それらの連結データをファイルに書き込むことができます

compress()

このメソッドは、指定されたデータを圧縮し、バイトオブジェクトを返します

flush()

このメソッドはバッファを空にし、バイトオブジェクトを返します。

次の例では、インクリメンタルコンプレッサーオブジェクトを使用してリストオブジェクトを圧縮します。

>>> data = [b'Hello World', b'How are you?', b'welcome to Python']
>>> obj = lzma.LZMACompressor()
>>> bindata = []
>>> for i in data:
bindata.append(obj.compress(i))
>>> bindata.append(obj.flush())
>>> bindata
[b'\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3', b'', b'', b"\x01\x00'Hello WorldHow are you?welcome to Python\x00\xf5\xc6\xc1d|\xf3\x8ey\x00\x01@(\xd4RJ\xe5\x1f\xb6\xf3}\x01\x00\x00\x00\x00\x04YZ"]

上記のコードは、元のリストの各アイテムの圧縮バイト表現のリストとしてbindataを構築します。 LZMADecompressorを使用して非圧縮データを取得するには オブジェクト、次のステートメントを使用します

>>> obj = lzma.LZMADecompressor()
>>> binstr = b''.join(bindata)
>>> obj.decompress(binstr)
b'Hello WorldHow are you?welcome to Python'

この記事では、lzmaモジュールのクラスと関数を例を挙げて説明しました。


  1. Pythonで平均シフトアルゴリズムを実装する

    機械学習には多くの種類のクラスタリングアルゴリズムがあります。これらのアルゴリズムはPythonで実装できます。この記事では、Pythonを使用した「平均シフト」アルゴリズムについて説明し、実装しましょう。これは、教師なし学習方法として使用されるクラスタリングアルゴリズムです。 このアルゴリズムでは、仮定は行われません。これは、それがノンパラメトリックアルゴリズムであることを意味します。このアルゴリズムは、データポイントを特定のクラスターに繰り返し割り当てます。これは、これらのデータポイントを最高密度のデータポイントにシフトすることによって行われます。 この高密度のデータポイントは、クラス

  2. Pythonを使用したBase64データエンコーディング

    base64モジュールの関数は、バイナリデータをプレーンテキストプロトコルを使用した送信に適したASCIIのサブセットに変換します。 エンコーディングおよびデコーディング機能は、Base16、Base32、およびBase64アルゴリズムを定義するRFC 3548の仕様と、デファクトスタンダードのAscii85およびBase85エンコーディングの仕様を実装します。 RFC 3548エンコーディングは、バイナリデータのエンコーディングに適しており、電子メールで安全に送信したり、URLの一部として使用したり、HTTPPOSTリクエストの一部として含めたりすることができます。 このモジュールによっ