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()してバイト列に変換してください。
