古いファイル削除は「容量圧迫を防ぎ、フォルダを常にクリーンに保つ」ための基本自動化
業務システムは毎日ファイルを生成し続けるため、放置するとフォルダが肥大化し、検索性が落ち、最悪ディスク容量を圧迫します。Python を使うと、更新日時・作成日時・ファイルサイズ・拡張子などを基準に、古いファイルを自動削除できます。ここでは初心者でも扱いやすいように、基本から実務テンプレートまで丁寧に解説します。
更新日時を基準に古いファイルを削除する(最も一般的な方法)
指定日数より古いファイルを削除するテンプレート
import os
import time
def delete_old_files(folder, days):
limit = time.time() - days * 86400 # 1日 = 86400秒
for name in os.listdir(folder):
path = os.path.join(folder, name)
if os.path.isfile(path):
if os.path.getmtime(path) < limit:
os.remove(path)
print("削除:", path)
delete_old_files("logs", 30) # 30日より古いファイルを削除
Python深掘りポイント
mtime(更新日時)は「最後に書き込まれた時刻」time.time()は現在時刻(秒)days * 86400で「◯日前」を秒に変換- 更新されていない古いファイルを安全に削除できる
拡張子を指定して古いファイルだけ削除する(ログ・CSV などに便利)
例:.log だけ削除対象にする
import os
import time
def delete_old_logs(folder, days):
limit = time.time() - days * 86400
for name in os.listdir(folder):
if not name.lower().endswith(".log"):
continue
path = os.path.join(folder, name)
if os.path.isfile(path) and os.path.getmtime(path) < limit:
os.remove(path)
print("削除:", path)
delete_old_logs("logs", 14)
Python深掘りポイント
- 拡張子フィルタで「必要なファイルを誤って消す」リスクを減らせる
- ログ・CSV・バックアップファイルなど用途別に整理しやすい
サブフォルダも含めて古いファイルを削除する(階層構造対応)
os.walk を使って階層全体を探索する
import os
import time
def delete_old_recursive(root, days):
limit = time.time() - days * 86400
for current, dirs, files in os.walk(root):
for name in files:
path = os.path.join(current, name)
if os.path.getmtime(path) < limit:
os.remove(path)
print("削除:", path)
delete_old_recursive("project_logs", 60)
Python深掘りポイント
os.walk()はサブフォルダも自動で探索- 大規模プロジェクトのログ整理に最適
- 階層が深くても同じロジックで処理できる
ファイルサイズを基準に削除する(容量圧迫対策)
例:100MB を超える古いファイルを削除
import os
def delete_large_files(folder, max_mb):
max_bytes = max_mb * 1024 * 1024
for name in os.listdir(folder):
path = os.path.join(folder, name)
if os.path.isfile(path) and os.path.getsize(path) > max_bytes:
os.remove(path)
print("削除:", path)
delete_large_files("uploads", 100)
Python深掘りポイント
- サイズ基準は「巨大ファイルが溜まるフォルダ」で効果的
- 動画・画像・バックアップファイルの整理に向いている
日付フォルダごと削除する(フォルダ単位の整理)
例:日付フォルダ(2024-03-01 など)を丸ごと削除
import os
import shutil
import time
def delete_old_date_folders(root, days):
limit = time.time() - days * 86400
for name in os.listdir(root):
path = os.path.join(root, name)
if os.path.isdir(path):
if os.path.getmtime(path) < limit:
shutil.rmtree(path)
print("削除:", path)
delete_old_date_folders("daily_logs", 90)
Python深掘りポイント
- 日付フォルダを丸ごと削除できるため管理が楽
shutil.rmtree()はフォルダごと削除する強力な関数(慎重に扱う)
削除前に「削除候補一覧」を表示する(安全性を高める)
実際に削除する前に確認したい場合
import os
import time
def preview_old_files(folder, days):
limit = time.time() - days * 86400
candidates = []
for name in os.listdir(folder):
path = os.path.join(folder, name)
if os.path.isfile(path) and os.path.getmtime(path) < limit:
candidates.append(path)
print("削除候補:")
for c in candidates:
print(" -", c)
preview_old_files("logs", 30)
Python深掘りポイント
- 誤削除を防ぐために「プレビュー → 本削除」の流れが安全
- 業務システムでは特に重要な設計
pathlib を使った読みやすい古いファイル削除
Path オブジェクトで直感的に書ける
from pathlib import Path
import time
def delete_old_path(folder: Path, days: int):
limit = time.time() - days * 86400
for p in folder.iterdir():
if p.is_file() and p.stat().st_mtime < limit:
p.unlink()
print("削除:", p)
delete_old_path(Path("logs"), 30)
Pythonメリット
p.stat()でメタ情報を簡単に取得unlink()で削除- パス操作が読みやすく、保守性が高い
古いファイル削除を業務で設計するときの視点
- 更新日時・作成日時・サイズなど、削除基準を明確にする
- 誤削除を防ぐために「プレビュー → 本削除」の流れを作る
- サブフォルダを含めるかどうかを決める
- ログ・バックアップ・アップロードファイルなど用途別にルールを分ける
- 削除後に ZIP/TAR 圧縮やアーカイブ移動と組み合わせるとさらに効率的

