Python 業務自動化 | ファイル・フォルダ自動化:基本操作 - 古いファイル削除

Python Python
スポンサーリンク

古いファイル削除は「容量圧迫を防ぎ、フォルダを常にクリーンに保つ」ための基本自動化

業務システムは毎日ファイルを生成し続けるため、放置するとフォルダが肥大化し、検索性が落ち、最悪ディスク容量を圧迫します。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 圧縮やアーカイブ移動と組み合わせるとさらに効率的

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