ファイル変更監視は「特定ファイルの更新をリアルタイムで検知し、自動処理を実行する」ための重要な仕組み
フォルダ全体を監視するディレクトリ監視に対して、ファイル変更監視は“特定のファイルだけ”に注目して変化を検知する点が特徴です。業務では次のような場面で非常に役立ちます。
- 設定ファイルが書き換えられたら自動で再読み込みしたい
- ログファイルが更新されたら新規行だけ解析したい
- 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()で絶対パス比較が簡単- パス結合が
/で直感的 - 大規模コードでも保守性が高い
ファイル変更監視を業務で設計するときの視点
- どのイベント(更新・作成・削除)を監視するか明確にする
- 特定ファイルだけを対象にすることで無駄な処理を避ける
- 更新をトリガーに自動処理(解析・集計・解凍)を組み合わせると強力
- 長時間動かす場合はログ出力や例外処理が重要
- ネットワークフォルダ監視は遅延があるため注意
