Python 業務自動化 | ファイル・フォルダ自動化:基本操作 - ZIP圧縮

Python Python
スポンサーリンク

ZIP圧縮は「ファイルをまとめて軽くし、安全に保管・転送する」ための基本技術

業務自動化では、ZIP圧縮は非常に重要な役割を持ちます。
レポートをまとめてメール送信したり、バックアップを軽量化したり、複数ファイルを一つにまとめて扱いやすくしたりと、用途は幅広いです。

Python では zipfile モジュールを使うことで、初心者でも安全に ZIP 圧縮ができます。
ここでは、基本から実務テンプレートまで、丁寧にかみ砕いて解説します。


ZIP圧縮の基本:zipfile.ZipFile を使う

最小構成:1つのファイルを ZIP にする

import zipfile

with zipfile.ZipFile("backup.zip", "w", compression=zipfile.ZIP_DEFLATED) as z:
    z.write("data/report.csv")
Python

重要ポイント

  • "w" は新規作成(既存 ZIP は上書きされる)
  • ZIP_DEFLATED は一般的な圧縮方式
  • write() にファイルパスを渡すだけで ZIP に追加できる

複数ファイルをまとめて ZIP にする

複数ファイルを一括で圧縮するテンプレート

import zipfile

files = [
    "data/report.csv",
    "data/summary.txt",
    "data/image.png"
]

with zipfile.ZipFile("bundle.zip", "w", zipfile.ZIP_DEFLATED) as z:
    for f in files:
        z.write(f)
Python

深掘りポイント

  • ループで write() を呼ぶだけで複数ファイルをまとめられる
  • ZIP 内のフォルダ構造を変えたい場合は arcname を指定できる

フォルダ丸ごと ZIP 圧縮する

os.walk を使ってフォルダ内のすべてのファイルを追加する

import os
import zipfile

folder = "project"
zip_name = "project.zip"

with zipfile.ZipFile(zip_name, "w", zipfile.ZIP_DEFLATED) as z:
    for current, dirs, files in os.walk(folder):
        for name in files:
            path = os.path.join(current, name)
            arcname = os.path.relpath(path, folder)
            z.write(path, arcname)
Python

深掘りポイント

  • os.walk() でサブフォルダも含めて探索
  • arcname を使うことで ZIP 内のフォルダ構造を保持
  • バックアップやプロジェクト丸ごとの保存に最適

例題①:日付付き ZIP バックアップを作成する

シナリオ

毎日 data フォルダを ZIP 圧縮してバックアップしたい。

import os
import zipfile
from datetime import date

folder = "data"
today = date.today().strftime("%Y-%m-%d")
zip_name = f"backup_{today}.zip"

with zipfile.ZipFile(zip_name, "w", zipfile.ZIP_DEFLATED) as z:
    for current, dirs, files in os.walk(folder):
        for name in files:
            path = os.path.join(current, name)
            arcname = os.path.relpath(path, folder)
            z.write(path, arcname)

print("バックアップ作成:", zip_name)
Python

深掘りポイント

  • 日付を付けることで「いつのバックアップか」が明確
  • ZIP 圧縮により容量削減+ファイルを一つにまとめられる

例題②:特定拡張子だけ ZIP にまとめる

シナリオ

フォルダ内の .csv だけを ZIP にしたい。

import os
import zipfile

folder = "data"
zip_name = "csv_only.zip"

with zipfile.ZipFile(zip_name, "w", zipfile.ZIP_DEFLATED) as z:
    for name in os.listdir(folder):
        path = os.path.join(folder, name)
        if os.path.isfile(path) and name.lower().endswith(".csv"):
            z.write(path, name)

print("CSVのみ圧縮:", zip_name)
Python

深掘りポイント

  • 拡張子フィルタと ZIP 圧縮を組み合わせると「必要なものだけ」まとめられる
  • ETL処理やレポート送信でよく使う

例題③:ZIP 圧縮後に元ファイルを削除する(アーカイブ化)

シナリオ

ログファイルを ZIP にまとめた後、元ファイルを削除して容量を節約したい。

import os
import zipfile

folder = "logs"
zip_name = "logs_archive.zip"

with zipfile.ZipFile(zip_name, "w", zipfile.ZIP_DEFLATED) as z:
    for name in os.listdir(folder):
        path = os.path.join(folder, name)
        if os.path.isfile(path):
            z.write(path, name)
            os.remove(path)

print("ログを圧縮して元ファイルを削除しました:", zip_name)
Python

深掘りポイント

  • ZIP 圧縮後に削除することでディスク容量を節約
  • ログ管理の自動化で非常に役立つ
  • 削除前に ZIP が正常に作成されたか確認するのが安全

pathlib を使った読みやすい ZIP 圧縮

Path オブジェクトで直感的に書ける

from pathlib import Path
import zipfile

folder = Path("data")
zip_name = "data.zip"

with zipfile.ZipFile(zip_name, "w", zipfile.ZIP_DEFLATED) as z:
    for p in folder.rglob("*"):
        if p.is_file():
            z.write(p, p.relative_to(folder))
Python

メリット

  • rglob("*") でサブフォルダも含めて探索
  • relative_to() で ZIP 内のフォルダ構造を保持
  • パス操作が読みやすく、ミスが減る

ZIP圧縮を業務で使うときの重要ポイント

  • 圧縮方式は ZIP_DEFLATED が一般的で扱いやすい
  • フォルダ丸ごと圧縮する場合は os.walk() または pathlib.rglob()
  • バックアップには日付やタイムスタンプを付けると管理しやすい
  • 圧縮後に元ファイルを削除する場合は慎重に扱う
  • ZIP 内のフォルダ構造を保持したい場合は arcname を使う

ZIP圧縮は、バックアップ・ログ管理・ファイル送信など、業務自動化のあらゆる場面で役立つ強力な技術です。

タイトルとURLをコピーしました