Pythonでディレクトリ監視とファイル変更の検出をする方法

この記事では、Pythonを使ったディレクトリの監視とファイル変更の検出手法について詳しく解説します。具体的なコード例、その解説、応用例を含めています。

目次

なぜディレクトリ監視が必要なのか

ディレクトリの監視は、ファイルの変更や新規作成、削除などのイベントをリアルタイムで検出するために行います。これは、バックアップの自動化、セキュリティの強化、システムの効率化など、多くの場面で役立ちます。

Pythonでの基本的なディレクトリ監視

Pythonでディレクトリ監視を行う基本的な手法は、`watchdog`というライブラリを使用する方法です。

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

class Watcher:

    DIRECTORY_TO_WATCH = "/path/to/my/directory"

    def __init__(self):
        self.observer = Observer()

    def run(self):
        event_handler = Handler()
        self.observer.schedule(event_handler, self.DIRECTORY_TO_WATCH, recursive=True)
        self.observer.start()
        try:
            while True:
                time.sleep(5)
        except:
            self.observer.stop()
            print("Observer Stopped")
            self.observer.join()

class Handler(FileSystemEventHandler):

    @staticmethod
    def process(event):
        # ファイルが変更されたかどうか
        if event.is_directory:
            return None
        elif event.event_type == 'modified':
            print(f'Modified file: {event.src_path}')

    def on_modified(self, event):
        self.process(event)

if __name__ == '__main__':
    w = Watcher()
    w.run()

このコードでは`watchdog`ライブラリを使用して、指定したディレクトリ内のファイル変更を監視します。`Handler`クラスにイベント処理を記述し、`Watcher`クラスで実際に監視を行っています。

応用例

応用例1: ファイル変更時にメール通知

ファイルが変更された際にメールで通知することもできます。

import smtplib
from email.mime.text import MIMEText

# 省略: Watcher クラス, Handler クラス

def send_email(message):
    from_email = "from_email@gmail.com"
    to_email = "to_email@gmail.com"
    msg = MIMEText(message)
    msg['Subject'] = "File Modified"
    msg['From'] = from_email
    msg['To'] = to_email

    s = smtplib.SMTP("smtp.gmail.com", 587)
    s.starttls()
    s.login(from_email, "password")
    s.sendmail(from_email, to_email, msg.as_string())
    s.quit()

class HandlerWithMail(Handler):

    @staticmethod
    def process(event):
        if event.is_directory:
            return None
        elif event.event_type == 'modified':
            message = f'Modified file: {event.src_path}'
            print(message)
            send_email(message)

応用例2: バックアップの自動化

ファイルが変更されたら自動でバックアップを取るようにすることもできます。

import shutil

# 省略: Watcher クラス, Handler クラス

class HandlerWithBackup(Handler):

    @staticmethod
    def process(event):
        if event.is_directory:
            return None
        elif event.event_type == 'modified':
            backup_path = f'/backup/{event.src_path}'
            shutil.copy(event.src_path, backup_path)
            print(f'Backup completed: {backup_path}')

応用例3: ファイル変更のログを取る

ファイルが変更されたことに関するログを取ることができます。

import logging

# 省略: Watcher クラス, Handler クラス

logging.basicConfig(filename='file_changes.log', level=logging.INFO)

class HandlerWithLogging(Handler):

    @staticmethod
    def process(event):
        if event.is_directory:
            return None
        elif event.event_type == 'modified':
            log_message = f'Modified file: {event.src_path}'
            logging.info(log_message)
            print(log_message)

まとめ

この記事では、Pythonを用いてディレクトリの監視とファイルの変更検出を行う方法を解説しました。基本的な実装からメール通

知、自動バックアップ、ログ取りまで、多角的な応用例をご紹介しました。

コメント

コメントする

目次