Pythonでlzhファイルを解凍する(Windows版)

Python

Pythonでlzhファイルを解凍するには?

Pythonではlzhファイルを解凍する場合lhafileモジュールを利用すると解凍することが可能です。本記事では、Pythonでlzhファイルを解凍するunzlha_file関数を作成する方法を紹介します。

事前準備

lzhファイルを解凍する前に2点事前準備が必要となります。
1つ目は事前インストールとしてMicrosoft C++ Build Tools(Microsoft Visual C++ 14.0 以上)が必要です。
2つ目はlhafileモジュールのインストールとなります。

事前インストール Microsoft C++ Build Tools

以下を参照してインストールすることが可能です。

1,Microsoft C++ Build Toolsをダウンロードする。
以下にアクセスします。
https://visualstudio.microsoft.com/visual-cpp-build-tools/

Build Toolsのダウンロードを押下します。

2,ダウンロードしたツールを起動ししてMicrosoft C++ Build Toolsをインストールします。

ダウンロードしたファイルを起動します。

C++によるデスクトップ開発の右上のチェックボックスをONにして、右下のインストールボタンを押下します。

lhafileモジュールのインストール

次にlhafileモジュールをインストールします。
筆者はVisual Studio Codeのターミナルで行っていますので参考ください。

pip install lhafile
と入力してlhafileモジュールをインストールします。

unlha_file関数のサンプルコード

まずは、unlha_file関数のサンプルコードを紹介します。
関数の下にはテスト用のコードも記載していますので参考にしてください。

import os
# pip install lhafile 
# 事前インストールとしてMicrosoft Visual C++ 14.0 以上が必要です。
# Microsoft C++ Build Tools "で入手してください: https://visualstudio.microsoft.com/visual-cpp-build-tools/
import lhafile

def unlha_file(lzh_path, extract_path=None):
    """
    LZHファイルを解凍する関数 
    ※日本語2バイト文字は解凍時にファイル名が文字化けします。また、ファイルが壊れる可能性があります。
    
    Args:
        lzh_path (str): LZHファイルのパス
        extract_path (str, optional): 解凍先のパス。未指定の場合はLZHファイルと同じ場所に解凍する。
        
    Returns:
        bool: 解凍が成功した場合はTrue、失敗した場合はFalseを返す。
    """
    
    try:
        # 解凍先パスが未指定の場合はLZHファイルと同じ場所に解凍する
        if extract_path is None:
            extract_path = os.path.dirname(lzh_path)
        
        # LZHファイルを開く
        lzh_ref = lhafile.Lhafile(lzh_path)
        
        # 各ファイルを解凍
        for file_info in lzh_ref.infolist():
            file_path = os.path.join(extract_path, file_info.filename)
            
            if file_info.filename.endswith('/'):  # ファイルの場合
                os.makedirs(file_path, exist_ok=True) 
            else: 
                os.makedirs(os.path.dirname(file_path), exist_ok=True) 
                with open(file_path, 'wb') as output_file:
                    output_file.write(lzh_ref.read(file_info.filename))

        lzh_ref.fp.close() # LZHファイルを閉じる

        return True  # 解凍成功時
    except Exception as e:
        print("Error:", str(e))
        return False  # 解凍失敗時




##############################################################
# 関数のテスト
if __name__ == "__main__":


    # テスト1 フォルダを圧縮したlzhファイルを解凍lzhファイルの場所に解凍
    lzh_file_path = "C:\\Users\\wkusr\\Desktop\\folder.lzh"  # 解凍したいlzhファイルのパスを指定

    success = unlha_file(lzh_file_path)
    if success:
        print("解凍が成功しました。")
    else:
        print("解凍に失敗しました。")


    # テスト2 フォルダを圧縮したlzhファイルを指定の場所に解凍
    lzh_file_path = "C:\\Users\\wkusr\\Desktop\\folder.lzh"  # 解凍したいlzhファイルのパスを指定
    extract_to_path = "C:\\Users\\wkusr\\Documents\\aaa"   # 解凍先のパスを指定。Noneの場合はlzhファイルと同じ場所に解凍

    success = unlha_file(lzh_file_path, extract_to_path)
    if success:
        print("解凍が成功しました。")
    else:
        print("解凍に失敗しました。")

    # テスト3 ファイルを圧縮したlzhファイルを解凍lzhファイルの場所に解凍
    lzh_file_path = "C:\\Users\\wkusr\\Desktop\\file.lzh"  # 解凍したいlzhファイルのパスを指定

    success = unlha_file(lzh_file_path)
    if success:
        print("解凍が成功しました。")
    else:
        print("解凍に失敗しました。")


    # テスト4 ファイルを圧縮したlzhファイルを指定の場所に解凍
    lzh_file_path = "C:\\Users\\wkusr\\Desktop\\file.lzh"  # 解凍したいlzhファイルのパスを指定
    extract_to_path = "C:\\Users\\wkusr\\Documents\\aaa"   # 解凍先のパスを指定。Noneの場合はlzhファイルと同じ場所に解凍

    success = unlha_file(lzh_file_path, extract_to_path)
    if success:
        print("解凍が成功しました。")
    else:
        print("解凍に失敗しました。")

サンプルのlzhファイルの中身

今回はサンプルとして2つのlzhファイルパターンを用意しています。

パターン1 フォルダを圧縮したlzh

このlzhファイルはフォルダの中に3つのファイルを圧縮して保存済のファイルです。

folderという名前のフォルダの中に3つのファイルがあり、lzh圧縮されているファイルです。

パターン2 ファイルのみ圧縮したlzh

このlzhファイルは3つのファイルを圧縮しただけのlzhです。

テスト実行する。

実際にテスト1から4を実行すると次のように解凍されます。

テスト1 フォルダを圧縮したlzhファイルを解凍lzhファイルの場所に解凍

デスクトップにフォルダごと解凍されます。

テスト2 フォルダを圧縮したlzhファイルを指定フォルダへ解凍

指定場所(今回はドキュメントのaaaフォルダに)解凍されます。

テスト3 ファイルを圧縮したlzhファイルを解凍lzhファイルの場所に解凍

デスクトップにファイルが解凍されます。

テスト4 ファイルを圧縮したlzhファイルを指定フォルダへ解凍

指定場所(今回はドキュメントのaaaフォルダに)解凍されます。

注意点

ファイル名やフォルダ名に日本語の2バイト文字で圧縮されていると文字化けを起こします。
例えば以下のように「フォルダ.lzh」というファイルがあり、「フォルダ」というフォルダ名と日本語の「ファイル1.xlsx」「ファイル2.xlsx」「utf_all.csv」で圧縮されている場合を例とします。

これを解凍すると以下のように文字化けします。

テキストファイルの場合にはファイル名が文字化けするだけですが、EXCELファイル等はファイルが壊れてしまいます。
このサンプルプログラムを利用する場合には、2バイト文字が入っていない前提で利用することをお勧めします。

また、lhafileモジュールで利用できるのは解凍処理だけで圧縮することはできません。

最後に

以上がPythonでlzhファイルを解凍する出力する方法です。

Pythonではlhafileモジュールをインストールして簡単に解凍することが可能となっています。

コメント

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