Pythonでフォルダの監視 WatchDog

プログラミング

概要

フォルダのファイルの中身を監視して変化があったか調べたいって結構あるのではないでしょうか?
応用が色々できるのではないかなという事で紹介します。

少し考えただけでも

  1. ある条件のファイルが作成されたらメールをを送信
  2. 自動バックアップ
  3. フォルダの変更を記録する
  4. 画像ファイルが保存されたら加工する – サムネイル
  5. フォルダの同期
  6. データ収集 – データベースへの保存や表計算ソフトで加工する

なんてことが出来ます。

以下を参考に記事を作りました。

Watchdog — watchdog 2.1.5 documentation

準備

pip install -U watchdog
と、マニュアルには書かれていますが “-U” は、古いWatchDogがあった場合アップグレードするという意味です。

今回は、Windows10環境でテストしています。

 テキストファイルが作られたら知らせるコード

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

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

class FindTxtHandler(FileSystemEventHandler):
    def on_created(self, event):
        if Path(event.src_path).suffix == ".txt":
            print("テキストファイルが作成されました")

if __name__ == "__main__":
    # 監視するフォルダ
    watch_folder = "./test_watch_folder"
    find_txt_handler = FindTxtHandler()
    observer = Observer()
    # recursive=Trueでサブフォルダも監視
    observer.schedule(
        find_txt_handler, watch_folder, recursive=True)

    observer.start()
    print(f"フォルダ '{watch_folder}' を監視します。")

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print("監視終了")
        observer.stop()

    observer.join()

 

このようなコードで、”test_watch_folder”にファイルが作られた場合何かのアクションを起こすことができます。
今回は、print()するだけですがここでメールを送信するコードを書いたり、加工したりするコードを書くことで色々できるわけです。
で、ファイルが作られた場合と言っていますが直接このフォルダに作られることのほかに
別の場所のファイルがこのフォルダにコピーされた場合も当てはまります。

この二つがキモになります。

  • Observer() (観察者の意味) : このインスタンスがフォルダを監視します。
    ハンドラー(何をするか)と監視フォルダを引数として渡します。
    オプションで “recursive = True”  とすると再帰的に監視フォルダ内のフォルダも監視します。
  • FileSystemEventHandlerクラス : これを継承したてハンドラークラスを作ります。
    WatchDogの中のevents.pyに”フックメソッド”が用意してあってそれを上書きすることで対応するイベントがあったときに何かの処理を行います。
    on_created
    on_modified
    on_deleted
    on_moved
    等があります。

4つのフックメソッド

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

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

class WatchFolderHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print(f'変更された: {event.src_path}')
    
    def on_created(self, event):
        print(f'作成された: {event.src_path}')
    
    def on_deleted(self, event):
        print(f'削除された: {event.src_path}')
    
    def on_moved(self, event):
        print(f'移動された: {event.src_path} -> {event.dest_path}')

if __name__ == "__main__":
    # 監視するフォルダ
    watch_folder = "./test_watch_folder"
    find_txt_handler = WatchFolderHandler()
    observer = Observer()
    # recursive=Trueでサブフォルダも監視
    observer.schedule(
        find_txt_handler, watch_folder, recursive=True)

    observer.start()
    print(f"フォルダ '{watch_folder}' を監視します。")

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print("監視終了")
        observer.stop()

    observer.join()

 

4つの”フックメソッド”を用意した基本コードがこちらになります。
大体この4つがあれば事足りるのではないでしょうか。

“on_created”でサムネイルを造ったり、データの処理を行う。データの処理は、”on_modified”も必要ですね。
同期を取ったりログを取ったりするときは、全部使いますよね。

まとめ

PythonのWatchdogライブラリを活用することで、フォルダ内のファイル変更をリアルタイムで監視し、特定のアクションを自動的に実行することが可能になります。この記事では、その基本的な使い方から応用例までを詳しく紹介しました。

  • Watchdogの概要と応用例:メール送信や自動バックアップ、画像のサムネイル生成、データ収集など、多岐にわたる用途で活用できることを説明しました。
  • 環境準備pip install -U watchdogコマンドでのインストール手順を解説しました。
  • 基本的なコード例:特定の拡張子のファイルが作成されたときに通知するサンプルコードを提供し、ObserverFileSystemEventHandlerの使い方を示しました。
  • 重要なポイント
    • Observer:フォルダを監視するインスタンスで、ハンドラーと監視対象フォルダを指定します。
    • FileSystemEventHandlerクラス:これを継承してカスタムハンドラーを作成し、特定のイベント発生時に処理を実行します。
    • フックメソッドon_createdon_modifiedon_deletedon_movedなどのメソッドをオーバーライドして、対応するイベントに対する処理を定義します。
  • 応用の可能性:サムネイル生成やデータ処理、同期、ログ取得など、目的に応じてフックメソッドを組み合わせて活用できることを提案しました。

この記事を通じて、Watchdogライブラリの基本的な使い方と、その応用範囲の広さを理解していただけたかと思います。自分のプロジェクトやニーズに合わせて、ぜひ活用してみてください。

Commnts