ファイル

[Python] watchdogライブラリの使い方 – フォルダの変更を監視する

watchdogライブラリは、Pythonでファイルやフォルダの変更を監視するためのツールです。

主にObserverクラスとFileSystemEventHandlerクラスを使用します。

Observerは監視対象のディレクトリを設定し、FileSystemEventHandlerを継承してイベント処理をカスタマイズします。

例えば、フォルダ内のファイル作成、削除、変更などのイベントを検知し、それに応じた処理を実行できます。

監視を開始するにはobserver.schedule(handler, path, recursive=True)で設定し、observer.start()を呼び出します。

watchdogライブラリとは

watchdogライブラリは、Pythonでファイルシステムの変更を監視するための便利なツールです。

このライブラリを使用することで、特定のフォルダ内でのファイルの作成、変更、削除などのイベントをリアルタイムで検知し、適切なアクションを実行することができます。

主な特徴は以下の通りです。

特徴説明
リアルタイム監視フォルダ内の変更を即座に検知できる
クロスプラットフォームWindows、macOS、Linuxで動作する
イベントハンドリング変更に応じたカスタムアクションを設定可能

このライブラリは、ファイルの監視が必要なアプリケーションやスクリプトに非常に役立ちます。

例えば、バックアップツールや自動化スクリプトなどで利用されることが多いです。

watchdogライブラリのインストール方法

watchdogライブラリは、Pythonのパッケージ管理ツールであるpipを使用して簡単にインストールできます。

以下の手順でインストールを行います。

インストール手順

  1. ターミナルまたはコマンドプロンプトを開く

使用しているOSに応じて、ターミナル(macOS/Linux)またはコマンドプロンプト(Windows)を開きます。

  1. pipを使用してwatchdogをインストール

以下のコマンドを入力して、watchdogライブラリをインストールします。

pip install watchdog
  1. インストールの確認

インストールが成功したか確認するために、以下のコマンドを実行します。

pip show watchdog

このコマンドを実行すると、watchdogのバージョンやインストール先のパスなどの情報が表示されます。

注意点

  • Pythonがインストールされていることを確認してください。
  • pipが正しく設定されている必要があります。

Pythonのバージョンによっては、pip3を使用する場合もあります。

これで、watchdogライブラリのインストールが完了しました。

次のステップでは、基本的な使い方について説明します。

基本的な使い方

watchdogライブラリを使用してフォルダの変更を監視する基本的な方法を説明します。

以下の手順で、特定のフォルダ内でのファイルの変更を検知する簡単なスクリプトを作成します。

以下のコードは、指定したフォルダ内でのファイルの作成、変更、削除を監視する基本的な例です。

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
# イベントハンドラのクラスを定義
class MyHandler(FileSystemEventHandler):
    def on_created(self, event):
        print(f'ファイルが作成されました: {event.src_path}')
    def on_modified(self, event):
        print(f'ファイルが変更されました: {event.src_path}')
    def on_deleted(self, event):
        print(f'ファイルが削除されました: {event.src_path}')
# 監視するフォルダのパスを指定
path = "監視するフォルダのパス"  # 例: "C:/my_folder"
# Observerを作成
observer = Observer()
event_handler = MyHandler()
# フォルダの監視を開始
observer.schedule(event_handler, path, recursive=False)
observer.start()
try:
    while True:
        time.sleep(1)  # 1秒ごとに監視
except KeyboardInterrupt:
    observer.stop()
observer.join()
  • FileSystemEventHandler: 変更イベントを処理するための基本クラスです。

このクラスを継承して、特定のイベント(作成、変更、削除)に対する処理を定義します。

  • on_created、on_modified、on_deleted: それぞれファイルが作成、変更、削除されたときに呼び出されるメソッドです。
  • Observer: 監視を行うためのオブジェクトです。

指定したフォルダを監視し、イベントが発生した際にハンドラを呼び出します。

  • schedule: 監視するフォルダとイベントハンドラを関連付けます。

recursiveオプションをTrueにすると、サブフォルダも監視対象になります。

  • start: 監視を開始します。
  • try-except: プログラムを実行中にCtrl+Cを押すことで、監視を停止できるようにしています。

このスクリプトを実行すると、指定したフォルダ内でのファイルの変更がリアルタイムでコンソールに表示されます。

次は、イベントハンドラのカスタマイズについて説明します。

イベントハンドラのカスタマイズ

watchdogライブラリでは、ファイルシステムの変更に対する反応をカスタマイズするために、イベントハンドラを自由に拡張できます。

ここでは、特定の条件に基づいて異なるアクションを実行する方法を説明します。

カスタマイズの例

以下のサンプルコードでは、ファイルの拡張子に応じて異なるメッセージを表示するカスタマイズされたイベントハンドラを作成します。

import time
import os
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
# カスタマイズされたイベントハンドラのクラス
class CustomHandler(FileSystemEventHandler):
    def on_created(self, event):
        if event.is_directory:
            print(f'フォルダが作成されました: {event.src_path}')
        else:
            ext = os.path.splitext(event.src_path)[1]
            if ext == '.txt':
                print(f'TXTファイルが作成されました: {event.src_path}')
            elif ext == '.jpg':
                print(f'JPGファイルが作成されました: {event.src_path}')
            else:
                print(f'新しいファイルが作成されました: {event.src_path}')
    def on_modified(self, event):
        print(f'ファイルが変更されました: {event.src_path}')
    def on_deleted(self, event):
        print(f'ファイルが削除されました: {event.src_path}')
# 監視するフォルダのパスを指定
path = "監視するフォルダのパス"  # 例: "C:/my_folder"
# Observerを作成
observer = Observer()
event_handler = CustomHandler()
# フォルダの監視を開始
observer.schedule(event_handler, path, recursive=False)
observer.start()
try:
    while True:
        time.sleep(1)  # 1秒ごとに監視
except KeyboardInterrupt:
    observer.stop()
observer.join()
  • is_directory: イベントがフォルダに関連するものであるかどうかを判定します。

フォルダが作成された場合には、特別なメッセージを表示します。

  • os.path.splitext: ファイルの拡張子を取得するために使用します。

これにより、特定の拡張子(例: .txt.jpg)に基づいて異なるメッセージを表示できます。

  • 条件分岐: 拡張子に応じて異なるアクションを実行するために、if文を使用しています。

これにより、特定のファイルタイプに対して特別な処理を行うことができます。

このように、watchdogライブラリのイベントハンドラをカスタマイズすることで、特定のニーズに応じた柔軟なファイル監視が可能になります。

次は、実践例としてフォルダの変更を監視するスクリプトを紹介します。

実践例:フォルダの変更を監視するスクリプト

ここでは、watchdogライブラリを使用して、特定のフォルダ内でのファイルの作成、変更、削除を監視する実践的なスクリプトを紹介します。

このスクリプトは、ユーザーが指定したフォルダ内での変更をリアルタイムで検知し、変更内容をコンソールに表示します。

以下のコードは、指定したフォルダ内のファイルの変更を監視する完全なスクリプトです。

import time
import os
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
# カスタマイズされたイベントハンドラのクラス
class FolderChangeHandler(FileSystemEventHandler):
    def on_created(self, event):
        if event.is_directory:
            print(f'フォルダが作成されました: {event.src_path}')
        else:
            print(f'ファイルが作成されました: {event.src_path}')
    def on_modified(self, event):
        if event.is_directory:
            print(f'フォルダが変更されました: {event.src_path}')
        else:
            print(f'ファイルが変更されました: {event.src_path}')
    def on_deleted(self, event):
        if event.is_directory:
            print(f'フォルダが削除されました: {event.src_path}')
        else:
            print(f'ファイルが削除されました: {event.src_path}')
# 監視するフォルダのパスを指定
path = "監視するフォルダのパス"  # 例: "C:/my_folder"
# Observerを作成
observer = Observer()
event_handler = FolderChangeHandler()
# フォルダの監視を開始
observer.schedule(event_handler, path, recursive=True)  # サブフォルダも監視
observer.start()
print(f'フォルダの変更を監視しています: {path}')
try:
    while True:
        time.sleep(1)  # 1秒ごとに監視
except KeyboardInterrupt:
    observer.stop()
    print('監視を停止しました。')
observer.join()
  • FolderChangeHandler: FileSystemEventHandlerを継承したカスタムイベントハンドラです。

ファイルやフォルダの作成、変更、削除に対する処理を定義しています。

  • on_created、on_modified、on_deleted: それぞれのメソッドで、ファイルやフォルダの状態に応じたメッセージを表示します。
  • recursive=True: サブフォルダも監視対象にするためのオプションです。

これにより、指定したフォルダ内のすべてのサブフォルダも監視されます。

  • try-except: プログラムを実行中にCtrl+Cを押すことで、監視を停止できるようにしています。

このスクリプトを実行すると、指定したフォルダ内でのファイルやフォルダの変更がリアルタイムでコンソールに表示されます。

これにより、フォルダの状態を常に把握することができ、さまざまな用途に応じた監視が可能になります。

次は、応用的な使い方について説明します。

応用的な使い方

watchdogライブラリは、基本的なファイル監視だけでなく、さまざまな応用的な使い方が可能です。

ここでは、いくつかの応用例を紹介します。

ログファイルの監視

特定のログファイルを監視し、新しいエントリが追加された際に通知を受け取るスクリプトを作成できます。

以下はその例です。

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class LogFileHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if event.src_path.endswith("log.txt"):  # 監視するログファイル
            with open(event.src_path, 'r') as file:
                lines = file.readlines()
                print(f'新しいログエントリ: {lines[-1].strip()}')
path = "監視するフォルダのパス"  # 例: "C:/my_folder"
observer = Observer()
event_handler = LogFileHandler()
observer.schedule(event_handler, path, recursive=False)
observer.start()
try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()
observer.join()

自動バックアップ

特定のフォルダ内のファイルが変更された際に、自動的にバックアップを作成するスクリプトを作成できます。

以下はその例です。

import shutil
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class BackupHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if not event.is_directory:
            backup_path = f"{event.src_path}.bak"
            shutil.copy(event.src_path, backup_path)
            print(f'バックアップ作成: {backup_path}')
path = "監視するフォルダのパス"  # 例: "C:/my_folder"
observer = Observer()
event_handler = BackupHandler()
observer.schedule(event_handler, path, recursive=False)
observer.start()
try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()
observer.join()

特定のファイルタイプの監視

特定の拡張子を持つファイルのみを監視し、変更があった場合に特定の処理を行うこともできます。

以下はその例です。

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class SpecificFileHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if event.src_path.endswith('.csv'):  # CSVファイルのみ監視
            print(f'CSVファイルが変更されました: {event.src_path}')
path = "監視するフォルダのパス"  # 例: "C:/my_folder"
observer = Observer()
event_handler = SpecificFileHandler()
observer.schedule(event_handler, path, recursive=False)
observer.start()
try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()
observer.join()

これらの応用例を通じて、watchdogライブラリの柔軟性と強力さを実感できるでしょう。

ファイル監視のニーズに応じて、さまざまなカスタマイズや機能を追加することで、より高度なアプリケーションを構築することが可能です。

まとめ

この記事では、Pythonのwatchdogライブラリを使用してフォルダの変更を監視する方法について詳しく解説しました。

基本的な使い方からカスタマイズ、実践例、応用的な使い方まで幅広く紹介し、さまざまなシナリオでの活用方法を示しました。

これを機に、実際にwatchdogを使って自分のプロジェクトに役立ててみてはいかがでしょうか。

関連記事

Back to top button