Pythonでwatchdogモジュールを使ってファイルの変更を監視する方法

Pythonでファイルやディレクトリの変更を監視する方法として、`watchdog` モジュールがよく用いられます。この記事では、`watchdog` モジュールの基本的な使い方から、実用的な応用例までを解説します。具体的なコード例とその詳細な解説、さらには応用例を2つ以上も紹介します。

目次

watchdogモジュールとは?

watchdogはPythonでファイルやディレクトリの変更を監視するためのライブラリです。このライブラリを使えば、ファイルが追加されたり、変更されたりしたときに自動で何らかの処理を行うプログラムを簡単に作成することができます。

基本的な使い方

インストール

まずは、watchdogモジュールをインストールしましょう。

pip install watchdog

簡単な例

以下は、`watchdog` を使った簡単なコード例です。

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

class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print(f'event type: {event.event_type}, path : {event.src_path}')

if __name__ == "__main__":
    observer = Observer()
    observer.schedule(MyHandler(), path='.', recursive=False)
    observer.start()

    try:
        while True:
            pass
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

コードの解説

1. `from watchdog.observers import Observer`と`from watchdog.events import FileSystemEventHandler`で必要なクラスをインポートしています。
2. `MyHandler` クラスで `FileSystemEventHandler` クラスを継承しています。
3. `on_modified` メソッドがファイル変更時に呼び出されます。この中で、変更があったファイルの情報を出力しています。
4. `Observer` クラスを用いて監視を開始しています。
5. KeyboardInterrupt(Ctrl+C)で監視を停止するようにしています。

応用例

特定の拡張子のファイルだけを監視する

import os

class FilteredHandler(FileSystemEventHandler):
    def on_modified(self, event):
        _, ext = os.path.splitext(event.src_path)
        if ext == '.txt':
            print(f'Text file modified: {event.src_path}')

コードの解説

この応用例では、`.txt` 拡張子のファイルだけを監視しています。`os.path.splitext()`関数でファイル名と拡張子を取得し、拡張子が`.txt`である場合のみ処理を行います。

ファイルが変更されたらメールを送る

import smtplib
from email.mime.text import MIMEText

class EmailHandler(FileSystemEventHandler):
    def on_modified(self, event):
        # メール設定
        subject = "File Modified"
        body = f"{event.src_path} has been modified."
        msg = MIMEText(body)
        msg["Subject"] = subject
        msg["From"] = "sender@example.com"
        msg["To"] = "receiver@example.com"

        # メール送信
        with smtplib.SMTP("smtp.example.com", 587) as s:
            s.login("username", "password")
            s.send_message(msg)

コードの解説

この例では、ファイルが変更されたら指定したメールアドレスに通知を送るようにしています。`smtplib`と`email.mime.text`を使って、簡単なメール送信の処理を記述しています。

まとめ

watchdogモジュールは非常に柔軟で、多くの応用例が考えられます。基本的な使い方から始めて、徐々に自分のニーズに合わせてカスタマイズしていくと良いでしょう。特定のファイル変更に何らかのアクションを起こすシステムを作る際には、watchdogが大いに役立つでしょう。

コメント

コメントする

目次