web-dev-qa-db-ja.com

pythonのディレクトリ構造を維持せずに、Zipアーカイブから特定のファイルを抽出します

Pythonを使用してZipアーカイブから特定のファイルを抽出しようとしています。

この場合、apk自体からapkのアイコンを抽出します。

私は現在使用しています

with zipfile.ZipFile('/path/to/my_file.apk') as z:
    # extract /res/drawable/icon.png from apk to /temp/...
    z.extract('/res/drawable/icon.png', 'temp/')

これは機能しますが、私のスクリプトディレクトリではtemp/res/drawable/icon.pngを作成しています。これは一時ファイルとapk内のファイルと同じパスです。

私が実際に欲しいのは、temp/icon.pngで終わることです。

これをZipコマンドで直接行う方法はありますか、それとも解凍してからファイルを移動し、ディレクトリを手動で削除する必要がありますか?

22
rcbevans

zipfile.ZipFile.open を使用できます。

import os
import shutil

with zipfile.ZipFile('/path/to/my_file.apk') as z:
    with z.open('/res/drawable/icon.png') as zf, open('temp/icon.png', 'wb') as f:
        shutil.copyfileobj(zf, f)

または zipfile.ZipFile.read を使用します。

import os

with zipfile.ZipFile('/path/to/my_file.apk') as z:
    with open('temp/icon.png', 'wb') as f:
        f.write(z.read('/res/drawable/icon.png'))
32
falsetru