【Python】ファイルをZIP形式で圧縮・作成する:zipfileの書き込みと追記

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")
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

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

目次