水. 12月 4th, 2024

スキルシェアリング.info

さまざまな問題にITスキルで立ち向かうITソリューションブログ

【Python】watchdogでファイルやフォルダを監視する

はじめに

どうもMizokeiです。
普段業務をしていると、ファイルやフォルダを監視したりして、その後のアクションに繋げたい事があるかと思います。

今日は、watchdogというライブラリを使用して、ファイルやフォルダを監視するスクリプトを作ってみたいと思います。ちなみに、今回の実行環境は以下です。

実行環境

  • Windows10 64bit
  • Python 3.7

いろんな処理に応用可能

今回作成する監視スクリプトによって、ファイルやフォルダの監視ができると、いろいろな処理に応用することが可能です。普段のプログラミングの参考にしてみてください。

  • ファイルが格納されたらメールで通知する
  • ファイルが格納されたら対象ファイルを移動する
  • フォルダが変更されていないかを確認する…etc

watchdogをインストール

まずは今回使用するwatchdogをpipを使ってインストールしましょう。

以下のように表示されるとインストールは完了です。

watchdogをインストールした様子

まずはライブラリをインポート

まずはいくつかのライブラリをインポートしましょう。フォルダ階層としてフォルダパスを取得するために、osや、一定時間の待機のためにtimeモジュールもインポートします。

インポート対象一覧

  • os
  • time
  • FileSystemEventHandler
  • Observer

以下、対象コードです。

次にイベントハンドラを定義する

また、ファイルが作成されたり変更されたりしたときのために、イベントハンドラを定義します。これによって、変更があった場合は、それぞれのイベントに対応した関数が呼ばれる仕組みです。

最後にフォルダ監視処理を記載する

最後に、対象フォルダの監視を行う処理を記載しましょう。今回は、スクリプトが実行しているフォルダパスを取得し、同一フォルダパス内でのイベント監視してみます。以下が対象コードです。

起動のログ

簡単に説明すると、最初に実行時のログを表示させています。

pythonスクリプトのフォルダパスを取得

実行しているpythonスクリプトの階層を監視するために、フォルダパスを絶対パスで取得しています。

フォルダ監視の開始

以下のコードでフォルダ監視の準備と監視を開始しています。

キー操作が無い限り監視

一回の監視で終了させないために、while文が使用されています。while文内で待機処理を行うことで、定期的にフォルダ内のイベントを監視する仕組みです。

また、ctrl+Cなどで、キー操作が行われるとエラーを発生させ、監視は終了します。同時に終了ログも表示させています。

バッググラウンドのスレッドを待機

以下のコードですが、実際には、バッググラウンドでスレッドが動作しているため、停止するまで待機し、プログラムを終了する流れです。

実行してみると…

作成した監視スクリプトを実行し、いくつかのファイル操作をしてみます。

  • 新しいテキストドキュメントを作成する
  • 新しいテキストドキュメントをhuga.txtに名前変更する
  • 新しいビットマップイメージ.bmpを作成する
2つのファイルを操作

すると、以下のような表示となりました。どうもファイルを作成したタイミングで、変更するイベントも呼ばれているみたいですね。

ファイルとフォルダ監視の様子

また、ファイル名が変更されたイベントが、対象の名前を持つファイルがなくなった(移動した)ものと、ファイル名が変更されたものの2つのイベントも走っているようです。

このあたりは少し使い方を工夫する必要がありそうですね。

今回作成した監視スクリプトの全文

では、今回作成したファイルやフォルダを監視するpythonスクリプトは以下です。他の処理と組み合わせて、使ってみてください。

この記事が誰かのお役に立てれば幸いです。それでは。