リンク

2017年6月27日火曜日

pythonでフォルダを監視する

今回はpythonで特定のフォルダを監視し、ファイルの発生や削除などを検知する方法をご紹介します。

環境
  • macOS Sierra 10.12.5
  • python 3.4
  •  
     
モジュールのインストール
今回使用するのは「watchdogモジュール」です。
Windowsの方はコマンドプロンプト、Macの方はターミナルを起動し、次のコマンドを実行してください。
>> pip install watchdog

pipが使用できない場合は以下よりソースファイルを取得し、中のsetup.pyを実行してください。
https://pypi.python.org/pypi/watchdog

モジュールの用意が整っている前提で進めます。

スクリプト
# -*- coding: utf-8 -*-

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

import os
import time

target_dir = "監視したいフォルダのパス"


class ChangeHandler(FileSystemEventHandler):
    def on_created(self, event):
        filepath = event.src_path
        filename = os.path.basename(filepath)
        print('%sができました' % filename)

    def on_modified(self, event):
        filepath = event.src_path
        filename = os.path.basename(filepath)
        print('%sを変更しました' % filename)

    def on_deleted(self, event):
        filepath = event.src_path
        filename = os.path.basename(filepath)
        print('%sを削除しました' % filename)


if __name__ in '__main__':
    while 1:
        event_handler = ChangeHandler()
        observer = Observer()
        observer.schedule(event_handler, target_dir, recursive=True)
        observer.start()
        try:
            while True:
                time.sleep(0.1)
        except KeyboardInterrupt:
            observer.stop()
        observer.join()


実行結果
こんな感じ。


解 説
細かい部分は省略するとして、重要なのはChangeHandlerクラス内の各メソッドです。
それぞれのメソッドはそれぞれ次のタイミングで発動します。
  • on_created  :ファイルやフォルダが 作られた時
  • on_modified  :ファイルやフォルダが 変更された時
  • on_deleted  :ファイルやフォルダが 削除された時
実行結果を見る限り、それぞれの発生タイミングには優先順位があるようです。

「event.src_path」で対象ファイル/フォルダのフルパスが取得できます。
今回は使用していませんが「event.is_directory」で対象がフォルダかどうかを判定するこおもできます。

watchdogモジュールの正式リファレンスは下記ページをご覧ください。
http://pythonhosted.org/watchdog/

まとめ
Windowsのタスクトレイに常駐するようなアプリであれば、今回のフォルダ監視機能と組み合わせると非常に便利なものができます。
例えば、「特定のフォルダ内にJPEGファイルが発生した際、自動的に指定するフォルダへ移動する」といったことも可能です。

使い方は無限大だと思いますので、ぜひ覚えていってください!

0 件のコメント:

コメントを投稿