Pythonのbz2モジュールを使ったbzip2圧縮・展開の完全ガイド
bzip2は、ファイルの圧縮・展開(伸長)を行うためのオープンソースの圧縮アルゴリズムです。Deflate方式(gzipやzlib)よりも高い圧縮率を実現できる一方、処理速度はやや遅いという特徴があります。
Pythonでは標準ライブラリのbz2モジュールを利用することで、このbzip2アルゴリズムをプログラムから簡単に扱うことができます。本記事では、bz2モジュールの主要な機能と具体的な使い方を解説します。
open()関数 ― bz2モジュールの基本インターフェース
open()関数は、bz2モジュールにおける最も基本的なインターフェースです。bzip2形式で圧縮されたファイルを開き、ファイルオブジェクトを返します。
ファイルはバイナリモードまたはテキストモードで開くことができ、読み込み・書き込みの両方に対応しています。引数compresslevelには1〜9の値を指定でき、数値が大きいほど圧縮率が高くなります(デフォルトは9)。ただし、圧縮率が高いほど処理時間も長くなる点に注意してください。
write()メソッド
ファイルを'w'または'wb'モードで開いた場合に使用できるメソッドです。バイナリモードでは圧縮されたデータがそのまま書き込まれ、テキストモードでは内部でTextIOWrapperオブジェクトによってラップされ、エンコード処理が自動的に行われます。
read()メソッド
読み込みモードでファイルを開いた場合に使用します。圧縮されたデータを自動的に展開し、元の(非圧縮の)データを返します。
open()を使った圧縮・展開の基本例
まずは、データをbzip2形式で圧縮してファイルに書き込む例です。
>>> import bz2
>>> f = bz2.open("test.bz2", "wb")
>>> data = b'Welcome to TutorialsPoint'
>>> f.write(data)
>>> f.close()
このコードを実行すると、カレントディレクトリにtest.bz2ファイルが作成されます。一般的な解凍ツールで中身を確認すると、「test」という名前のファイルが格納されていることがわかります。
次に、作成したtest.bz2ファイルから元のデータを読み出すコードです。
>>> f = bz2.open("test.bz2", "rb")
>>> data = f.read()
>>> f.close()
>>> data
b'Welcome to TutorialsPoint'
読み込み時に自動的に展開されるため、元のバイト列がそのまま取得できます。
BZ2Fileクラス
bz2モジュールには、BZ2Fileクラスも定義されています。open()関数の実体であり、コンストラクタのmode引数の値に応じて、圧縮用・展開用のどちらとしても動作するファイル風オブジェクトを作成できます。
パラメータの指定方法はopen()関数と同様で、fileとmodeが必須です。compresslevelのデフォルト値は9で、1〜9の範囲で指定できます。
インクリメンタル(逐次)圧縮:BZ2Compressor
BZ2Compressor()は、インクリメンタル(逐次)圧縮を行うためのオブジェクトを返します。大きなデータを一度にメモリへ読み込めない場合など、データを少しずつ圧縮したい場面で便利です。
- compress()メソッド: 呼び出すたびに、入力データの圧縮結果(チャンク)を返します。複数のチャンクは連結可能です。
- flush()メソッド: 内部バッファを空にし、残りの圧縮データを返します。圧縮を完了する際に必ず呼び出す必要があります。
インクリメンタル展開:BZ2Decompressor
BZ2Decompressor()は、逐次的に展開処理を行うオブジェクトを返します。decompress()メソッドの戻り値として得られる各チャンクを連結することで、完全な非圧縮データが復元されます。
実践例:リスト内の各要素を逐次圧縮して保存・復元する
以下の例では、リスト内の各要素を順番に圧縮し、その結果を連結して1つのファイルに書き込んでいます。その後、BZ2Decompressorを使って元のデータを復元します。
>>> import bz2
>>> data = [b'Hello World', b'How are you?', b'welcome to Python']
>>> obj = bz2.BZ2Compressor()
>>> f = bz2.open("test.bz2", "wb")
>>> d1 = obj.compress(data[0])
>>> d2 = obj.compress(data[1])
>>> d3 = obj.compress(data[2])
>>> d4 = obj.flush()
>>> compressedobj = d1 + d2 + d3 + d4
>>> f.write(compressedobj)
>>> f.close()
圧縮したデータは、次のようにBZ2Decompressorオブジェクトを使って復元できます。
>>> obj = bz2.BZ2Decompressor()
>>> f = bz2.open("test.bz2", "rb")
>>> data = f.read()
>>> f.close()
>>> obj.decompress(data)
b'Hello WorldHow are you?welcome to Python'
このように、bz2モジュールを使えば「一括圧縮」から「ストリーミング的な逐次圧縮」まで柔軟に対応できます。大量のデータやネットワーク経由でのデータ転送を扱う場合には、BZ2Compressor/BZ2Decompressorによるインクリメンタル処理が特に有効です。
-
PCで使えるおすすめファイル転送アプリ6選|スマホ・PC間のデータ移行を簡単に
かつては、パソコンから別のパソコンやスマートフォンへデータを移すのに、面倒な手順を踏む必要がありました。しかし現在では、PCとスマホ、あるいはPC同士の間でデータを手軽に転送できるアプリが数多く登場しています。そこで本記事では、数あるPC用ファイル転送アプリの中から、用途に応じて使い分けられるおすすめの6つのツールを厳選してご紹介します。Part 1:PCとスマホ間のデータ転送に最適なアプリパソコンからスマートフォンへ(またはその逆に)データを転送したいだけであれば、MobileTransやAirDroidといったアプリが便利です。アプリ1:Wondershare MobileTransPC向
-
Windowsで使えるおすすめファイル圧縮ツール15選【無料・有料対応】
スマートフォンを初期化したらデータがすべて消えてしまった——。しかし賢いあなたは、初期化前にパソコンへバックアップを取っていました。ところが今度は、バックアップファイルのサイズが大きすぎて、そのままでは扱いにくいという問題に直面します。そんなときの解決策はシンプルです。そう、ファイル圧縮です。高品質なファイル圧縮ソフトを使えば、バックアップデータを扱いやすいサイズまで小さくできます。 インターネット上には評判の良い無料の圧縮ソフトが数多く存在するため、どれを選べばよいか迷ってしまうこともあるでしょう。そこで本記事では、Windowsで使える優秀なファイル圧縮ツールを15個厳選し、それぞれの特徴