Pythonのzlibモジュールで実現するgzip互換のデータ圧縮
Python標準ライブラリのzlibモジュールは、GNUプロジェクトの一部であるZlib圧縮ライブラリ(https://www.zlib.net)をPythonから利用するための実装を提供します。gzip形式とも互換性があり、データ圧縮・解凍の処理を手軽に行えるのが特徴です。
この記事では、zlibモジュールに定義されている主要な関数とクラスについて、具体例を交えながら解説します。
compress()関数 ― データを圧縮する
compress()関数は、decompress()関数と並ぶこのモジュールの中心的なインターフェースです。引数として渡したデータを圧縮し、バイトオブジェクト(bytes型)として返します。
オプションの引数levelを指定すると、圧縮率を制御できます。levelには0〜9の整数を指定でき、0は無圧縮、9が最高圧縮率を意味します。圧縮レベルを高くするほど、圧縮後のデータサイズは小さくなりますが、その分処理時間も長くなる点に注意しましょう。
decompress()関数 ― 圧縮データを元に戻す
decompress()関数は、compress()関数とは逆の働きをし、圧縮されたデータから元のデータを復元します。オプション引数wbitsを指定すると、履歴バッファのサイズやヘッダー・フッターの形式を制御できます。
次のコードでは、文字列をcompress()関数で圧縮しています。
>>> import zlib
>>> c = zlib.compress(b'hello python')
>>> c
b'x\x9c\xcbH\xcd\xc9\xc9W(\xa8,\xc9\xc8\xcf\x03\x00\x1e\xf0\x04\xd7'
続いて、decompress()関数を使えば、元の文字列を復元できます。
>>> zlib.decompress(c)
b'hello python'
ストリーム処理のためのオブジェクト
zlibモジュールには、圧縮用・解凍用それぞれに対応する2つのクラスが定義されており、大きなデータをストリームとして段階的に処理できます。
compressobj() ― 圧縮オブジェクトの生成
compressobj()コンストラクタは、データストリームを圧縮するための圧縮オブジェクトを返します。このオブジェクトの主なメソッドは以下の2つです。
- compress():圧縮済みのバイトオブジェクトを返します。
- flush():圧縮オブジェクトはストリームを扱うため、一部の圧縮データがバッファ内に残ることがあります。このメソッドを呼び出すことで、バッファ内の残りデータをすべて吐き出します。
次の例では、圧縮オブジェクトを作成し、compress()メソッドの戻り値にflush()の結果を連結して、最終的な圧縮データを構築しています。
>>> s1 = b'hello python'
>>> c = zlib.compressobj()
>>> s2 = c.compress(s1)
>>> s2 = s2+c.flush()
>>> s2
b'x\x9c\xcbH\xcd\xc9\xc9W(\xa8,\xc9\xc8\xcf\x03\x00\x1e\xf0\x04\xd7'
decompressobj() ― 解凍オブジェクトの生成
decompressobj()コンストラクタは、ストリームから大きなデータを解凍するための解凍オブジェクトを生成します。このオブジェクトが提供する主なメソッドは以下の通りです。
- decompress():解凍されたデータを返します。
- flush():バッファ内の残りデータを空にします。
先ほどの例で作成した圧縮データから、元のデータを取り出すコードは次のようになります。
>>> d = zlib.decompressobj()
>>> x = d.decompress(s2)
>>> x = x+d.flush()
>>> x
b'hello python'
バージョン情報を取得する定数
zlibモジュールには、使用中のzlibライブラリのバージョン情報を提供する2つの定数が定義されています。
>>> zlib.ZLIB_VERSION
'1.2.11'
>>> zlib.ZLIB_RUNTIME_VERSION
'1.2.11'
ZLIB_VERSIONはコンパイル時に組み込まれたzlibのバージョンを、ZLIB_RUNTIME_VERSIONは実行時にロードされているzlibのバージョンを表します。通常、両者は同じ値ですが、環境によって異なる場合があります。
-
Pythonの弱参照(weakref)モジュールの使い方を徹底解説
Pythonで弱参照(Weak Reference)を作成するには、標準ライブラリの weakref モジュールを使用します。弱参照はオブジェクトを生存させ続ける力を持たない参照であり、その主な用途として、大きなオブジェクトに対するキャッシュやマッピングの実装が挙げられます。 weakrefモジュールのインポート このモジュールを使うには、まず以下のようにインポートします。 import weakref なお、すべてのオブジェクトが弱参照をサポートしているわけではありません。例えば tuple や int といった一部の組み込み型は弱参照に対応していません。そのため、通常は独自に定義したク
-
Pythonのtimetuple()メソッドとは?struct_timeオブジェクトの基本と使い方
Pythonでは、datetime.dateインスタンスが持つtimetuple()メソッドを呼び出すと、time.struct_time型のオブジェクトが返されます。struct_timeは名前付きタプル(named tuple)の一種で、インデックス番号だけでなく、属性名を使って各フィールドにアクセスできるのが特徴です。struct_timeオブジェクトの構成要素struct_timeオブジェクトには、日付と時刻の両方を表す属性が含まれており、さらに夏時間(DST:Daylight Saving Time)が有効かどうかを示すフラグも持っています。timetuple()関数が返す名前付きタ