バックアップ作成は「データを守る」業務自動化の中心機能
業務自動化の中でも、バックアップ作成は特に重要です。
ファイル破損・誤削除・上書きミス・システム障害など、どんな現場でも起こり得るトラブルからデータを守るために、自動バックアップは欠かせません。
Pythonでは、shutil.copy() / shutil.copy2() / shutil.copytree() を使うことで、初心者でも安全にバックアップ処理を実装できます。
ここでは、基本から実務テンプレートまで、丁寧にかみ砕いて解説します。
バックアップの基本:shutil.copy と shutil.copy2 の違い
ファイル単体のバックアップ(copy)
import shutil
shutil.copy("data/report.csv", "backup/report.csv")
Pythoncopy() は「中身だけ」コピーします。
ただし、更新日時などのメタ情報はコピーされません。
メタ情報も含めてコピーしたい場合(copy2)
import shutil
shutil.copy2("data/report.csv", "backup/report.csv")
Pythoncopy2() は、更新日時・作成日時などのメタデータもコピーします。
業務バックアップでは 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
バックアップは「失敗すると取り返しがつかない」処理なので、
安全設計を徹底することが最も重要です。

