Pythonのzipfile
モジュールを使用すると、ZIPファイルからファイルを抽出することができます。しかし、デフォルトではZIPファイル内のディレクトリ構造が保持されます。これは、特定の場合には望ましくないかもしれません。例えば、すべてのファイルを一つのディレクトリにフラットに抽出したい場合などです。
以下に、ZIPファイルからファイルを抽出し、元のディレクトリ構造を保持せずに指定したディレクトリにフラットに展開する方法を示します。
import os
import zipfile
my_dir = "D:\\Download"
my_zip = "D:\\Download\\my_file.zip"
with zipfile.ZipFile(my_zip) as zip_file:
for member in zip_file.namelist():
filename = os.path.basename(member)
# skip directories
if not filename:
continue
# copy file (taken from zipfile's extract)
source = zip_file.open(member)
target = open(os.path.join(my_dir, filename), "wb")
with source, target:
shutil.copyfileobj(source, target)
このコードは、ZIPファイルのメンバーのファイルハンドルを開き、ファイル名を抽出し、ターゲットファイルにコピーします(これはZipFile.extract
の動作方法ですが、サブディレクトリは考慮されません)。
この方法を使用すれば、ZIPファイルからファイルを抽出し、元のディレクトリ構造を保持せずに指定したディレクトリにフラットに展開することができます。これは、ZIPファイルから特定のファイルを迅速に抽出する必要がある場合や、ディレクトリ構造を無視してすべてのファイルを一箇所に集めたい場合など、さまざまなシナリオで役立ちます。