一昔前の日本では、ファイルの圧縮に LZH フォーマットがよく使われていた。 今ではほとんど使われることが無くなったとはいえ、しぶとく生き残っているシステムもある。 今回は、そうしたシステムからダウンロードしたファイルを Python の lhafile で展開する方法について書く。
使った環境は次のとおり。
$ sw_vers ProductName: macOS ProductVersion: 13.5 BuildVersion: 22G74 $ uname -srm Darwin 22.6.0 arm64 $ lha --version LHa for UNIX version 1.14i-ac20050924p1 (arm-apple-darwin22.1.0) $ python -V Python 3.10.12 $ pip list | grep lhafile lhafile 0.3.0
もくじ
下準備
LZH フォーマットの圧縮ファイルを用意するために lha をインストールしておく。
$ brew install lha
そして、本題となる lhafile もインストールしておく。
$ pip install lhafile
圧縮ファイルを用意する
まずは展開のサンプルに使う圧縮ファイルを用意したい。
まずは greet.txt
という名前でテキストファイルを作成する。
$ echo "Hello, World" > greet.txt
上記のファイルを lha(1) で圧縮する。
$ lha a greet.lzh greet.txt greet.txt - Frozen(100%)o
これで greet.lzh
という名前で圧縮ファイルができた。
$ file greet.lzh greet.lzh: LHarc 1.x/ARX archive data [lh0], 'U' OS
lhafile で展開する
ここからは Python の REPL を使って動作を見ていく。
$ python
まずは lhafile
モジュールから LhaFile
クラスをインポートする。
>>> from lhafile import LhaFile
先ほどのファイル名を指定してクラスをインスタンス化しよう。
>>> lha_file = LhaFile("greet.lzh")
圧縮ファイルに含まれるファイル名のリストは LhaFile#namelist()
メソッドで得られる。
>>> lha_file.namelist()
['greet.txt']
圧縮ファイルに含まれるファイルの内容を展開したいときは LhaFile#read()
メソッドを使う。
先ほど得られたファイル名を指定することで、展開したファイルのバイト列が得られる。
>>> lha_file.read("greet.txt") b'Hello, World\n'
バイト列さえ得られれば、あとは好きに処理すれば良い。 たとえば、またファイルとして書き出してみよう。
>>> with open("/tmp/greet.txt", mode="wb") as fp: ... fp.write(lha_file.read("greet.txt")) ... 13
書き出したファイルの中身を確認すると、ちゃんと圧縮前の内容が得られる。
$ cat /tmp/greet.txt
Hello, World
いじょう。