PythonでLZH形式のファイルを解凍したい

PythonでLZH形式のファイルを解凍するには lhafile パッケージをインストールします。ここでは Google Colab を利用して実際に LZH形式のファイルを解凍してみましょう。

LZH形式は脆弱性の問題から使用されなくなりましたが、Windows 98 頃までは割と標準的な圧縮形式だったと思います。

まずはpipコマンドでlhafileパッケージをインストールします。

pip install lhafile

次に以下のスクリプトを実行してください。

# LZHファイルの格納先を指定 ※ColabでGoogleドライブをマウントした状態を想定
LZH_FILE_DIR = 'drive/My Drive/sample_lzh/'

# LZHファイルの解凍先を指定 ※ColabでGoogleドライブをマウントした状態を想定
UNLZH_FILE_DIR = 'drive/My Drive/sample_unlzh/'

# OSの機能を利用するパッケージ os をインポート
import os

# 正規表現をサポートするパッケージ re をインポート
import re

# LZH形式のファイルを解凍するパッケージ lhafile をインポート ※要インストール
import lhafile

# 日付を扱う datetime パッケージから datetime をインポート
from datetime import datetime as dt

# 開始合図
print('作業を開始します')

# 解凍先のディレクトリを作成
os.makedirs(UNLZH_FILE_DIR, exist_ok=True)

# 格納先にあるファイルのリストを取得
file_list = os.listdir(LZH_FILE_DIR)

# リストからファイルを順に取り出す
for file in file_list:
    # 拡張子が lzh のファイルに対してのみ実行
    if re.search(".lzh", file):
        # LZHファイルを解凍
        print(LZH_FILE_DIR + file + ' を解凍します')
        unlzh_object = lhafile.Lhafile(LZH_FILE_DIR + file)

        # ファイルの情報を順に取り出す
        for info in unlzh_object.infolist():
            file_name = info.filename
            file_datetime = str(info.date_time)

            # ファイルを解凍して保存 ※withで開く場合はclose不要
            unlzh_file = open(UNLZH_FILE_DIR + file_name, 'wb')
            unlzh_file.write(unlzh_object.read(file_name))
            unlzh_file.close()

            # ファイルの作成日時・更新日時を圧縮したときのものに変更
            atime = mtime = dt.strptime(file_datetime, '%Y-%m-%d %H:%M:%S').timestamp()
            os.utime(UNLZH_FILE_DIR + file_name, (atime, mtime))

            print(file_name + ' ' + file_datetime + ' を解凍しました')

# 終了合図
print('作業を終了しました')

ここでは sample.lzh というファイルを解凍しました。このファイルは3つのテキストファイルをLZH形式で圧縮したものです。うまく解凍できれば次のように表示されます。

無事に指定したパスに解凍されていることが分かります。

なお上記のスクリプトでは次の点が考慮されています。単純に解凍するだけであればもう少し短いスクリプトで済むでしょう。

  • 同じパスに存在する複数のLZHファイルを一度に解凍
  • 圧縮時の作成日時(更新日時)でファイルを保存

またLZHファイルの中身が1ファイルであることが分かっている場合には、for文で回す処理も不要となります。状況に合わせて改変してください。

タイトルとURLをコピーしました