web-dev-qa-db-ja.com

すべてのOSでPythonでファイルを解凍する方法は?

そのような.Zipファイルの解凍を可能にする単純なPython関数はありますか?:

unzip(ZipSource, DestinationDirectory)

Windows、Mac、Linuxで同じように動作するソリューションが必要です。Zipがファイルの場合は常にファイルを作成し、Zipがディレクトリの場合はディレクトリを作成し、Zipが複数のファイルの場合はディレクトリを作成します。指定された宛先ディレクトリではなく、常に内部

Pythonでファイルを解凍するにはどうすればよいですか?

26
tkbx

標準ライブラリの zipfile モジュールを使用します。

import zipfile,os.path
def unzip(source_filename, dest_dir):
    with zipfile.ZipFile(source_filename) as zf:
        for member in zf.infolist():
            # Path traversal defense copied from
            # http://hg.python.org/cpython/file/tip/Lib/http/server.py#l789
            words = member.filename.split('/')
            path = dest_dir
            for Word in words[:-1]:
                while True:
                    drive, Word = os.path.splitdrive(Word)
                    head, Word = os.path.split(Word)
                    if not drive:
                        break
                if Word in (os.curdir, os.pardir, ''):
                    continue
                path = os.path.join(path, Word)
            zf.extract(member, path)

extractall を使用するとはるかに短くなりますが、そのメソッドは path traversalの脆弱性 に対してnot保護します= before Python 2.7.4。コードが最新バージョンのPythonで実行されることを保証できる場合。

44
phihag

Python 3.xは-hではなく-e引数を使用します。

python -m zipfile -e compressedfile.Zip c:\output_folder

引数は次のとおりです。

zipfile.py -l zipfile.Zip        # Show listing of a zipfile
zipfile.py -t zipfile.Zip        # Test if a zipfile is valid
zipfile.py -e zipfile.Zip target # Extract zipfile into target dir
zipfile.py -c zipfile.Zip src ... # Create zipfile from sources
4
Dave