lhafile

Description

Lhafile is python C extension to extract lha file(.lzh). It does not need external program for extract. It has only extract function, not archive function. Its interface is likely zipfile module is included in regular python envrionment.

Lhafileは Pythonの C Extensionで、Lha アーカイブファイル(.lzh) を解凍します。外部プログラムは必要ありません。 ただし、解凍機能のみで圧縮機能はありません。 Pythonの標準モジュールであるzipfileモジュールと似たインターフェイスで利用が可能です。

Install

First, make sure you’ve installed pip or setuptools.

インストール方法は setup toolsを利用した方法が pip でインストール可能です。

% easy_install http://svn.neotitans.net/lhafile/
% pip install http://svn.neotitans.net/lhafile/

Download

You can download here or use  svn ※ 04/28/2011 I attached buggy binaries and sources. So I fixed some problems and attached again after tested in the Windows7 Home(32bit and 64bit python 2.6 or 2.7) and MacOSX10.6(32bit python2.6).

SVNを利用してソースは入手可能です。アーカイブされているファイルは以下にあります。

※ 04/28/2011 不具合だらけのバイナリとソースを添付していたので、修正してかつ動作確認したものを再添付します。MacOSX(32bit python?) と Windows7 Home(32,64bitそれぞれで python2.6と2.7)でテスト済み。

Binaries

lhafile-0.1.win32-py2.6.exe
lhafile-0.1.win32-py2.7.exe
lhafile-0.1.win-amd64-py2.6.exe
lhafile-0.1.win-amd64-py2.7.exe

Source

lhafile-0.1.tar.gz
lhafile-0.1.zip

Example

You can use this module likely zipfile module.

利用方法は zipfile と似た利用方法です。以下はサンプルとなります。

import lhafile

# Create Lhafile instance from filename
f = lhafile.Lhafile('foo.lzh')

# Print each file informaion in archive file.
for info in f.infolist():
   print info.filename

# Extract data from archive
f.read('bar.txt')

すべてのファイルをカレントディレクトリに書きだす場合。

SJISの日本語が混じったファイル名が入っている場合で、かつWindowsで使っている場合はディレクトリ区切り文字の処理で注意が必要なので、ディレクトリ名だけ抽出するときに少し小細工が入っています。

import os
import sys

def extract_all(lzhname):
    """Extract files under current directory"""
    print "Extract", lzhname, "..."
    # make directory to extract
    root, ext = os.path.splitext(lzhname)
    try:
        os.makedirs(root)
    except OSError, e:
        print e
        return
    # open lzh file and get file names in it.
    lha = lhafile.Lhafile(lzhname)
    files = [info.filename for info in lha.infolist()]
    # extract all files
    for filename in files:
        ufilename = unicode(filename, "cp932")
        dirname = os.path.dirname(ufilename)
        basename = os.path.basename(ufilename)
        try:
            os.makedirs(os.path.join(root, dirname))
        except OSError, e:
            pass
        if basename:
            print " extract", filename
            open(os.path.join(root, dirname, basename), "wb").write(lha.read(filename))
            
if __name__ == '__main__':
    extract_all(sys.argv[1])

いちおう、ここ にある lhaca, lhaplus, lhaunix でそれぞれアーカイブしたファイルを Windows、Macで正しく解凍できることを確認しています。

Attachments