【Python】ZIPファイルの展開と操作:zipfileモジュールの使い方

Python標準ライブラリの zipfile モジュールを使用すると、ZIP形式の圧縮ファイルを解凍(展開)したり、解凍せずに中身のファイル名一覧を確認したりできます。

ここでは、業務データのバックアップファイル(ZIP)を操作するシナリオを例に、基本操作からパスワード付きZIPの処理までを解説します。

目次

1. ZIPファイルの中身を確認する(展開なし)

解凍する前に、中にどのようなファイルが入っているかを確認するには namelist() メソッドを使用します。

ソースコード

import zipfile

# 対象のZIPファイル
zip_target = "backup_data.zip"

print(f"--- {zip_target} の中身 ---")

# 'r' モード(読み込み)で開く
with zipfile.ZipFile(zip_target, "r") as zf:
    # namelist() はアーカイブ内のファイル名リストを返します
    file_names = zf.namelist()
    
    for name in file_names:
        print(name)

実行結果

--- backup_data.zip の中身 ---
data/
data/user_list.csv
data/sales_report.xlsx
readme.txt

2. 全てのファイルを一括展開する

ZIP内のすべてのファイルを指定したフォルダに解凍するには extractall() メソッドを使用します。

ソースコード

import zipfile

# 展開先のフォルダ名
extract_dir = "restored_files"

with zipfile.ZipFile("backup_data.zip", "r") as zf:
    # extractall(展開先パス)
    # パスを指定しない場合はカレントディレクトリに展開されます
    zf.extractall(extract_dir)
    
print(f"フォルダ '{extract_dir}' にすべて展開しました。")

3. 特定のファイルだけを展開する

特定のファイル(例えば readme.txt だけ)を取り出したい場合は、extract() メソッドを使用します。 ※ extractall で特定のリストを渡す方法もありますが、単一ファイルならこちらが簡潔です。

ソースコード

import zipfile

target_file = "readme.txt"
output_dir = "docs"

with zipfile.ZipFile("backup_data.zip", "r") as zf:
    # extract(ファイル名, 展開先パス)
    path = zf.extract(target_file, output_dir)
    print(f"抽出完了: {path}")

4. パスワード付きZIPファイルを展開する

パスワードが設定されている場合は、extractall()extract() の引数 pwd にパスワードを指定します。 重要: パスワードは文字列(str)ではなく、バイト列(bytes) で渡す必要があります。

ソースコード

import zipfile

# パスワード付きZIPファイル
secure_zip = "confidential.zip"
# パスワード(バイト列にするため b"..." を付けます)
zip_password = b"SecretKey123"

try:
    with zipfile.ZipFile(secure_zip, "r") as zf:
        # pwd引数にバイト列のパスワードを渡して展開
        zf.extractall("secret_data", pwd=zip_password)
        
    print("暗号化ZIPの展開に成功しました。")

except RuntimeError as e:
    # パスワードが間違っている場合などは RuntimeError になります
    print(f"展開エラー: {e}")
except zipfile.BadZipFile:
    print("ZIPファイルが破損しています。")

解説

  • zipfile.ZipFile(file, mode): ファイルを開くためのクラスです。読み込み時は mode='r' を指定します。with 文を使うことで、処理終了後にファイルを自動的に閉じてくれます。
  • パス区切り文字: Windows環境などでパスを指定する場合、バックスラッシュ \ がエスケープ文字として扱われないよう、r"C:\path\to" のように r を付けたRaw文字列を使うか、スラッシュ / を使うのが安全です(PythonはWindowsでも / をパス区切りとして認識します)。
  • pwd 引数: 文字列のまま pwd="pass" と渡すとエラーになります。必ず pwd=b"pass" または .encode() してバイト列に変換してください。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次