わたねこコーリング

野良プログラマ発、日々のアウトプット

【Python】Zip ファイルから特定のファイルだけパスを付けずに取り出す

沢山のファイルが詰め込まれている Zip ファイルから、特定の条件(拡張子とか)のものだけ選んで解凍保存したい。その際、パスが深いと保存場所がとっ散らかるのでディレクトリは取っ払って一箇所に集めたい、という状況で書いた Python コードです。

下記は、拡張子が .xbrl のものだけ見つけて、パスからディレクトリ部分を除去してカレントディレクトリに保存するという例です。ファイル名が重複している場合は考慮してません。

import zipfile
import re
import os

zip_file = 'my.zip'
with zipfile.ZipFile(zip_file, 'r') as zf:
    for info in zf.infolist():
        m = re.match(r'.+\.xbrl', info.filename, flags=re.IGNORECASE)
        if not m:
            continue
        info.filename = os.path.basename(info.filename)
        zf.extract(info)

info.filename への上書きでファイルパスを変更し、extract() にその info を渡すところがキモでしょうか。割とありがちなユースケースのような気がしますが、結構調べてしまったのでおすそ分けです。しかし、何をやろうとしているのかが拡張子でバレバレですなw