Python|ファイル更新監視を行う(watchdog)

1. はじめに

Pythonでファイルやディレクトリの変更をリアルタイムに検知したい場面は多くあります。例えばログファイルの更新監視、CSVファイルの自動読み込み、あるいはバックアップ処理のトリガーなどです。
本記事では、Pythonの便利なライブラリwatchdogを用いて、ファイル更新監視を行う方法を解説します。

「Python|ファイル更新監視を行う(watchdog)」というテーマのもと、初心者〜中級者にも分かりやすいコード例や実行結果を交えて、実務や学習に役立つ情報をお届けします。

 

2. Pythonでファイル更新を監視する基本:watchdogとは

2-1. watchdogとは?

watchdogは、ファイルシステムの変更(作成、更新、削除など)をリアルタイムで検知できるPythonライブラリです。
特定のディレクトリを監視し、変更があった際に任意の処理を実行するような仕組みを簡単に構築できます。

2-2. インストール方法

まずはwatchdogをインストールしましょう。以下のコマンドでインストールできます。

pip install watchdog

2-3. 基本的な使い方(簡単なコード例)

次に、指定フォルダを監視し、ファイルの変更を検知してメッセージを出力する基本コードを紹介します。

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

# カスタムイベントハンドラーを定義
class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print(f"変更を検出: {event.src_path}")

# 監視対象ディレクトリ
path = "./watch_folder"

event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path=path, recursive=True)
observer.start()

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

実行結果:

変更を検出: ./watch_folder/sample.txt

このスクリプトは、./watch_folderフォルダ内でファイルが変更されるたびにそのファイルパスを表示します。

 

3. よくある使い方・応用例

3-1. ファイルの作成・削除・更新を全て検知する

on_createdon_deletedon_modifiedon_movedといったイベントをハンドリングすることで、さまざまなファイル操作を検知できます。

class MyHandler(FileSystemEventHandler):
    def on_created(self, event):
        print(f"作成されました: {event.src_path}")

    def on_deleted(self, event):
        print(f"削除されました: {event.src_path}")

    def on_modified(self, event):
        print(f"変更されました: {event.src_path}")

    def on_moved(self, event):
        print(f"移動されました: {event.src_path} → {event.dest_path}")

実行結果:

作成されました: ./watch_folder/new_file.txt
変更されました: ./watch_folder/existing_file.txt
削除されました: ./watch_folder/old_file.txt
移動されました: ./watch_folder/temp.txt → ./watch_folder/final.txt

3-2. 特定の拡張子だけを監視する

ファイルの種類を制限したい場合は、イベントハンドラー内で条件分岐を入れることで対応できます。

import os

class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if event.is_directory:
            return
        if os.path.splitext(event.src_path)[1] == ".csv":
            print(f"CSVファイルが更新されました: {event.src_path}")

実行結果:

CSVファイルが更新されました: ./watch_folder/data.csv

 

4. 注意点・エラー対策

4-1. CPU使用率が高くなるケース

常に監視し続けるため、複数のフォルダを再帰的に監視するとCPU使用率が高くなる場合があります。
必要な範囲だけを監視する、time.sleep()でループを制御するなどの対策が有効です。

4-2. パスが存在しないとエラーになる

指定したディレクトリが存在しないとFileNotFoundErrorが発生します。スクリプト実行前に存在チェックを行いましょう。

import os
if not os.path.exists(path):
    print("監視対象ディレクトリが存在しません。")
    exit()

4-3. ファイル監視が止まらない

無限ループで監視し続けるため、スクリプトを止めるにはCtrl + C(KeyboardInterrupt)が必要です。
一時的な監視を行いたい場合は、タイマーやカウント制御を加えることをおすすめします。

 

5. まとめ

  • watchdogを使えば、Pythonで簡単にファイルの更新監視ができる
  • ファイルの変更・作成・削除・移動をリアルタイムに検知可能
  • 条件分岐やカスタム処理で柔軟な応用が可能

実務では、ログの監視やデータファイルの更新検知、バッチ処理のトリガーなどに活用できます。
学習のコツは、まず1つのイベント(たとえばon_modified)に絞って動かしてみることです。理解が深まったら、複数イベントや条件分岐へステップアップしてみましょう。

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