見出し画像

Python、「フォルダ内監視アプリ」作ってみた。

pip install watchdog
import time
import os
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from plyer import notification  # plyerは通知を表示するためのライブラリです。インストール: pip install plyer

class FolderWatcher(FileSystemEventHandler):
    def on_created(self, event):
        if event.is_directory:
            return
        else:
            self.show_notification(f"新しいファイルが追加されました: {event.src_path}")

    def show_notification(self, message):
        notification.notify(
            title='フォルダ変更通知',
            message=message,
            app_name='Folder Watcher',
            timeout=5
        )

def watch_folder(folder_path):
    event_handler = FolderWatcher()
    observer = Observer()
    observer.schedule(event_handler, path=folder_path, recursive=False)
    observer.start()

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

if __name__ == "__main__":
    folder_path_to_watch = "監視するフォルダのパスをここに指定"
    watch_folder(folder_path_to_watch)


データ追加直後、横からシュッと登場しました。
すごいです。

他のフォルダもチェックしたい場合

import time
import os
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from plyer import notification

class FolderWatcher:
    def __init__(self, folder_path, folder_name):
        self.folder_path = folder_path
        self.folder_name = folder_name
        self.event_handler = FileSystemEventHandler()
        self.last_notification = None

        self.event_handler.on_created = self.on_created
        self.event_handler.on_modified = self.on_modified
        self.event_handler.on_deleted = self.on_deleted

        self.observer = Observer()
        self.observer.schedule(self.event_handler, path=self.folder_path, recursive=False)

    def start(self):
        self.observer.start()

    def stop(self):
        self.observer.stop()
        self.observer.join()

    def on_created(self, event):
        if event.is_directory:
            return
        else:
            time.sleep(1)  # 新しいファイルが作成された後、1秒間待機
            message = f"ファイルが作成されました: {event.src_path}"
            # on_modified で通知された場合はスキップ
            if message == self.last_notification:
                return
            self.show_notification(message, self.folder_name)
            self.last_notification = message

    def on_modified(self, event):
        if event.is_directory:
            return
        else:
            message = f"ファイルが変更されました: {event.src_path}"
            # 前回と同じ通知の場合はスキップ
            if message == self.last_notification:
                return
            self.show_notification(message, self.folder_name)
            self.last_notification = message

    def on_deleted(self, event):
        if event.is_directory:
            return
        else:
            pass

    def show_notification(self, message, folder_name):
        notification.notify(
            title=f'フォルダ変更通知({folder_name})',
            message=message,
            app_name='Folder Watcher',
            timeout=5
        )

if __name__ == "__main__":
    folder_path_to_watch = "C:\\Users\\デスクトップ\\1"
    folder_path_to_watch2 = "C:\\Users\\デスクトップ\\1\\2"

    watcher1 = FolderWatcher(folder_path_to_watch, "1")
    watcher2 = FolderWatcher(folder_path_to_watch2, "2")

    watcher1.start()
    watcher2.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        watcher1.stop()
        watcher2.stop()

1つデータが追加されると「作成されました」「変更されました」と2回通知が来てしまいますが、上書き保存された場合「変更されました」となるのでまぁこれでいいかなと思いました。

何度も、フォルダ内を確認するのが面倒だったのですが、これで解決しそうです。


最後までお読みいただきありがとうございます。
♡頂けますと、励みになります。

この記事が気に入ったらサポートをしてみませんか?