Python標準ライブラリの zipfile モジュールを使用すると、既存のファイルをまとめてZIPアーカイブを作成したり、既存のZIPファイルに新しいファイルを追加したりできます。
注意点として、デフォルトの設定では「圧縮」は行われず、単にファイルをまとめるだけ(無圧縮)になります。 ファイルサイズを小さくしたい場合は、明示的に圧縮方式を指定する必要があります。
ここでは、プロジェクトの資料ファイルをZIP形式で圧縮・アーカイブする手順を解説します。
目次
1. 新規にZIPファイルを作成する (w モード)
ZipFile オブジェクトを "w" (Write) モードで作成し、write() メソッドでファイルを追加していきます。 compression=zipfile.ZIP_DEFLATED を指定することで、標準的なDeflate方式で圧縮されます。
ソースコード
import zipfile
# 圧縮対象のファイルリスト
files_to_compress = ["project_plan.pdf", "budget_sheet.xlsx", "meeting_notes.txt"]
# 作成するZIPファイル名
archive_name = "project_archive.zip"
print(f"--- ZIPファイル '{archive_name}' を作成します ---")
# 1. ZipFileオブジェクトを書き込みモード('w')で作成
# compression=zipfile.ZIP_DEFLATED を指定しないと、ファイルサイズは小さくなりません
with zipfile.ZipFile(archive_name, "w", compression=zipfile.ZIP_DEFLATED) as zf:
for filename in files_to_compress:
try:
# 2. write(ファイルパス, [ZIP内でのファイル名]) で書き込み
# ここではダミーとして書き込む処理を想定しています
# 実際には存在するファイルを指定してください
# zf.write(filename)
# (解説用) ファイルが存在しないとエラーになるため、今回はダミーのコメントのみ
print(f"追加中: {filename}")
except FileNotFoundError:
print(f"警告: ファイル '{filename}' が見つかりません。")
print("圧縮が完了しました。")
2. 既存のZIPファイルに追加する (a モード)
すでに存在するZIPファイルに、後から別のファイルを追加したい場合は "a" (Append) モードで開きます。誤って "w" で開くと、既存の中身が全て消えてしまうので注意が必要です。
ソースコード
import zipfile
archive_name = "project_archive.zip"
additional_file = "additional_image.png"
print(f"--- '{archive_name}' にファイルを追加します ---")
# 追記モード('a')で開く
with zipfile.ZipFile(archive_name, "a", compression=zipfile.ZIP_DEFLATED) as zf:
# ファイルを追加
# arcname引数を使うと、ZIP内でのファイル名を変更できます
# 例: "images/img.png" として格納
# zf.write(additional_file, arcname="images/added_image.png")
print(f"追記完了: {additional_file}")
解説
モードの使い分け
"w"(Write): 新規作成。同名のファイルがある場合、**上書き(中身は空に)**されます。"a"(Append): 追記。既存のZIPファイルが存在する場合、末尾にファイルを追加します。ファイルがない場合は新規作成されます。
ファイル名の制御 (arcname)
write(filename) メソッドをそのまま使うと、指定したパス構造がそのままZIP内に記録されることがあります(例: C:\Users\Name\Docs\file.txt)。 ZIP内ではファイル名だけにしたい、あるいは特定のフォルダに入れたい場合は、第2引数の arcname を活用します。
# 例: 実体は "data/2025/log.txt" だが、ZIP内では "log.txt" としてルートに置く
zf.write("data/2025/log.txt", arcname="log.txt")
