Python 業務自動化 | ファイル・フォルダ自動化:基本操作 - バックアップ作成

Python Python
スポンサーリンク

バックアップ作成は「データを守る」業務自動化の中心機能

業務自動化の中でも、バックアップ作成は特に重要です。
ファイル破損・誤削除・上書きミス・システム障害など、どんな現場でも起こり得るトラブルからデータを守るために、自動バックアップは欠かせません。

Pythonでは、shutil.copy() / shutil.copy2() / shutil.copytree() を使うことで、初心者でも安全にバックアップ処理を実装できます。
ここでは、基本から実務テンプレートまで、丁寧にかみ砕いて解説します。


バックアップの基本:shutil.copy と shutil.copy2 の違い

ファイル単体のバックアップ(copy)

import shutil

shutil.copy("data/report.csv", "backup/report.csv")
Python

copy() は「中身だけ」コピーします。
ただし、更新日時などのメタ情報はコピーされません

メタ情報も含めてコピーしたい場合(copy2)

import shutil

shutil.copy2("data/report.csv", "backup/report.csv")
Python

copy2() は、更新日時・作成日時などのメタデータもコピーします。
業務バックアップでは copy2 が推奨 です。


フォルダ丸ごとバックアップ:shutil.copytree

フォルダを丸ごとコピーする

import shutil

shutil.copytree("data", "backup/data_backup")
Python

フォルダ内のファイル・サブフォルダをすべてコピーします。
ただし、コピー先フォルダが存在するとエラーになるため、実務では存在チェックが必須です。


バックアップ前に必ず行うべき「存在確認」と「フォルダ作成」

存在確認を入れる理由を深掘りする

バックアップ元が存在しないとエラーになります。
バックアップ先フォルダが存在しないとコピーできません。

そのため、次の2つは必須です。

  • バックアップ元の存在確認
  • バックアップ先フォルダの自動作成
import os
import shutil

src = "data/report.csv"
dst_dir = "backup"
dst = os.path.join(dst_dir, "report.csv")

if not os.path.isfile(src):
    print("バックアップ元がありません:", src)
else:
    os.makedirs(dst_dir, exist_ok=True)
    shutil.copy2(src, dst)
    print("バックアップ完了:", dst)
Python

例題①:日付フォルダを作ってバックアップする

シナリオ

毎日生成されるレポートを、日付ごとのフォルダにバックアップしたい。

import os
import shutil
from datetime import date

src = "data/report.csv"
today = date.today().strftime("%Y-%m-%d")
dst_dir = os.path.join("backup", today)

os.makedirs(dst_dir, exist_ok=True)

if os.path.isfile(src):
    shutil.copy2(src, dst_dir)
    print("バックアップ完了:", dst_dir)
else:
    print("バックアップ元がありません:", src)
Python

深掘りポイント

  • 日付フォルダを作ることで「いつのバックアップか」が一目で分かる
  • copy2 を使うことで更新日時も保持される

例題②:フォルダ全体をバックアップ(上書き防止付き)

シナリオ

project フォルダを丸ごとバックアップしたいが、
同名フォルダがあれば上書きしたくない。

import os
import shutil
from datetime import datetime

src = "project"
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
dst = f"backup/project_{timestamp}"

if os.path.exists(dst):
    print("バックアップ先が既に存在します:", dst)
else:
    shutil.copytree(src, dst)
    print("フォルダバックアップ完了:", dst)
Python

深掘りポイント

  • copytree は「コピー先が存在するとエラー」
  • タイムスタンプを付けることで毎回ユニークなフォルダ名になる
  • 上書き事故を防げる

例題③:バックアップログを残す(実務で非常に重要)

シナリオ

バックアップした日時・ファイル名・サイズをログに残したい。

import os
import shutil
from datetime import datetime

src = "data/report.csv"
dst_dir = "backup"
log_file = "backup.log"

os.makedirs(dst_dir, exist_ok=True)

if os.path.isfile(src):
    dst = os.path.join(dst_dir, os.path.basename(src))
    shutil.copy2(src, dst)

    size = os.path.getsize(dst)
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    with open(log_file, "a", encoding="utf-8") as f:
        f.write(f"{now}\t{src}\t{dst}\t{size} bytes\n")

    print("バックアップ完了:", dst)
else:
    print("バックアップ元がありません:", src)
Python

深掘りポイント

  • ログを残すことで「いつ何をバックアップしたか」が追跡できる
  • トラブル時の調査が圧倒的に楽になる

pathlib を使った読みやすいバックアップコード

Path を使うとパス操作が直感的になる

from pathlib import Path
import shutil

src = Path("data/report.csv")
dst_dir = Path("backup")

dst_dir.mkdir(exist_ok=True)
shutil.copy2(src, dst_dir / src.name)

print("バックアップ完了:", dst_dir / src.name)
Python

メリット

  • / 演算子でパス結合できる
  • Path オブジェクトは読みやすく、ミスが減る

バックアップ処理を安全にするための考え方

  • バックアップ元の存在確認は必須
  • バックアップ先フォルダは自動作成する
  • 上書き防止のために「存在チェック」または「タイムスタンプ付与」
  • copy2 を使ってメタ情報も保持する
  • ログを残すことでトラブル時の調査が容易になる
  • フォルダ丸ごとなら copytree、ファイル単体なら copy2

バックアップは「失敗すると取り返しがつかない」処理なので、
安全設計を徹底することが最も重要です。

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