Python 業務自動化 | ファイル・フォルダ自動化:基本操作 - ファイル変更監視

Python Python
スポンサーリンク

ファイル変更監視は「特定ファイルの更新をリアルタイムで検知し、自動処理を実行する」ための重要な仕組み

フォルダ全体を監視するディレクトリ監視に対して、ファイル変更監視は“特定のファイルだけ”に注目して変化を検知する点が特徴です。業務では次のような場面で非常に役立ちます。

  • 設定ファイルが書き換えられたら自動で再読み込みしたい
  • ログファイルが更新されたら新規行だけ解析したい
  • CSV が上書きされたら自動で集計処理を走らせたい
  • 外部システムが出力するファイルの更新をトリガーにしたい

Python では watchdog を使うことで、ファイルの「作成・更新・削除」をリアルタイムに検知できます。


監視の基本:watchdog を使って特定ファイルの変更を検知する

必要なインストール

pip install watchdog

最小構成:特定ファイルの更新を検知する

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
import os

class FileChangeHandler(FileSystemEventHandler):
    def __init__(self, target):
        self.target = os.path.abspath(target)

    def on_modified(self, event):
        if os.path.abspath(event.src_path) == self.target:
            print("ファイルが更新されました:", event.src_path)

def watch_file(path):
    folder = os.path.dirname(path)
    observer = Observer()
    observer.schedule(FileChangeHandler(path), folder, recursive=False)
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()

    observer.join()

watch_file("config/settings.ini")
Python

重要ポイント

  • フォルダ全体を監視しつつ、イベントが対象ファイルかどうかを判定する
  • on_modified は「上書き・追記・保存」を検知
  • recursive=False で無駄な監視を避ける

ファイル更新時に自動処理を実行する(最もよく使うパターン)

例:設定ファイルが更新されたら自動で再読み込みする

import json

class ConfigHandler(FileSystemEventHandler):
    def __init__(self, target):
        self.target = os.path.abspath(target)

    def on_modified(self, event):
        if os.path.abspath(event.src_path) == self.target:
            print("設定ファイル更新:", event.src_path)
            with open(self.target, "r", encoding="utf-8") as f:
                config = json.load(f)
            print("新しい設定:", config)

watch_file("config.json")
Python

深掘りポイント

  • 設定ファイルの変更をトリガーに自動処理が走る
  • サーバー設定・アプリ設定のホットリロードに応用できる
  • JSON・INI・YAML など形式を問わず使える

例題①:ログファイルが更新されたら新規行だけ読み取る

シナリオ

ログが追記されたら、新しく追加された行だけ解析したい。

class LogTailHandler(FileSystemEventHandler):
    def __init__(self, target):
        self.target = os.path.abspath(target)
        self.position = 0

    def on_modified(self, event):
        if os.path.abspath(event.src_path) == self.target:
            with open(self.target, "r", encoding="utf-8") as f:
                f.seek(self.position)
                new_lines = f.readlines()
                self.position = f.tell()

            for line in new_lines:
                if "ERROR" in line:
                    print("エラー検出:", line.strip())

watch_file("app.log")
Python

深掘りポイント

  • seek()tell() を使って「前回以降の行だけ」読む
  • ログ監視ツールのような動作を Python だけで実現できる
  • ERROR 行のリアルタイム検出に最適

例題②:CSV が更新されたら自動で集計処理を実行する

シナリオ

売上データ CSV が更新されたら自動で合計を計算したい。

import pandas as pd

class CSVUpdateHandler(FileSystemEventHandler):
    def __init__(self, target):
        self.target = os.path.abspath(target)

    def on_modified(self, event):
        if os.path.abspath(event.src_path) == self.target:
            print("CSV更新:", event.src_path)
            df = pd.read_csv(self.target)
            print("売上合計:", df["amount"].sum())

watch_file("sales.csv")
Python

深掘りポイント

  • CSV の更新をトリガーに自動集計
  • 手動で Excel を開く必要がなくなる
  • 日次・時間単位の自動レポート生成に応用できる

例題③:ファイルが削除されたら通知する

シナリオ

重要ファイルが誤って削除されたらすぐに気づきたい。

class DeleteHandler(FileSystemEventHandler):
    def __init__(self, target):
        self.target = os.path.abspath(target)

    def on_deleted(self, event):
        if os.path.abspath(event.src_path) == self.target:
            print("警告:ファイルが削除されました!", event.src_path)

watch_file("important.txt")
Python

深掘りポイント

  • 削除イベントはセキュリティ監視にも使える
  • 誤操作の早期発見に役立つ

pathlib を使った読みやすいファイル監視コード

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

from pathlib import Path

class PathFileHandler(FileSystemEventHandler):
    def __init__(self, target: Path):
        self.target = target.resolve()

    def on_modified(self, event):
        if Path(event.src_path).resolve() == self.target:
            print("更新:", self.target.name)

def watch_path_file(path: Path):
    observer = Observer()
    observer.schedule(PathFileHandler(path), str(path.parent), recursive=False)
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()

    observer.join()

watch_path_file(Path("config.ini"))
Python

メリット

  • resolve() で絶対パス比較が簡単
  • パス結合が / で直感的
  • 大規模コードでも保守性が高い

ファイル変更監視を業務で設計するときの視点

  • どのイベント(更新・作成・削除)を監視するか明確にする
  • 特定ファイルだけを対象にすることで無駄な処理を避ける
  • 更新をトリガーに自動処理(解析・集計・解凍)を組み合わせると強力
  • 長時間動かす場合はログ出力や例外処理が重要
  • ネットワークフォルダ監視は遅延があるため注意

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