🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2080閲覧

watchdog()を用いたファイル処理

takumi_f

総合スコア5

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/25 06:30

前提・実現したいこと

pythonのwatchdogを用いてファイルの監視を行い,ファイルが生成されたときにクラス外の処理に移るプログラムを作成しています.

発生している問題・エラーメッセージ

on_created() missing 1 required positional argument: 'event'

python

class ChangeHandler(FileSystemEventHandler): def on_created(self, event): print('[set target path 1]') for file in os.listdir('.'): if fnmatch.fnmatch(file,'*.FPP'): self.target_path_1 = os.path.join(os.path.dirname(__file__), file) print('target_path_1: ', target_path_1) return self.target_path_1 target_path_2 = ChangeHandler() with open(target_path_2.on_created(),"r+b") as f:

試したこと

on_create()の第2引数のeventが邪魔して通らない?

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matobaa

2019/10/25 07:06 編集

ちょっと設計の意図をつかみかねるので教えてください。 1) 2行目からの on_created(self, event) でなにをやらせようと考えていますか? 2) with の中の open(target_path_2.on_created(), "r+b") では、なにをしようと考えていますか?
takumi_f

2019/10/25 07:14

コメントありがとうございます。 1)on_created()で,ファイルが生成されたことを検知して,target_path_1の情報をChangeHandler()外でも使いたい 2)target_path_1のファイルを開きたい 以上のように考えております。
matobaa

2019/10/25 07:28

なるほどわかってきました。 3) 上記回答の「ファイルが生成されたことを」での「ファイル」は、target_path_1 そのものを期待していますか? それとも「特定のディレクトリの中の任意のファイル」などでしょうか? 4) *.FPPというファイルがそこになかったらどうしたいですか? 5) 2)の処理「ファイルを開きたい」について、開くきっかけはなにを使おうとしていますか? (もし「ファイルが生成されたら」であれば、1)で受け取ったその「きっかけ」を2)にわたす必要があるのだけど、そのへんの設計や実装がわからないということだろうか)
takumi_f

2019/10/25 08:01

追記ありがとうございます。 3)target_path_1そのものが欲しいです。ここでのtarget_path_1の情報は'*.FPP'の情報です.'*.FPP'はバイナリファイルなので"r+b"でopenしようとしています. 4)*.FPPがなければスクリプトは実行しっぱなしですね.*.FPPは別機器から生成されるファイルなので,*.FPPが生成されたらChangeHandler以下の処理を行うようにしたいと考えています. 5)きっかけはファイルの生成です.ファイル生成→読み取り→演算→出力ができることを目指しています.
guest

回答1

0

ベストアンサー

watchdogの使い方が微妙にずれているようです。on_XXXXX はふつうは呼ばれるものであって、(凝ったことをやるのでなければ)自分で呼び出すケースはあまりありません。

なのでまず、以下を参考に役割分担を整理してみてください。

  1. フォルダ変更監視はObserverが担う。どのフォルダを監視するかはObserverに指定する。

今回のケースでは、'.'dirname(__file__)はObserverを作るときの引数で指定すべき。

  1. 監視するファイル名を*.FPPに絞るには、PatternMatchingEventHandler を使う。

今回のケースでは、class ChangeHandler(FileSystemEventHandler): のところを(PatternMatchingEventHandler): として、__init__あたりで patterns を指定するとよいでしょう。
なお、指定するパターンの表現については pathtoolsもみてください。

  1. 変更監視で検知されたとき、「なにが起こったか」はevent引数を調べる。

今回のケースでは、on_createdのevent引数としてFileCreatedEventをもらえるので、そのsrc_pathからファイル名を取り出せるはず。

つぎに、「クラス外の処理に移る」やり方についてですが、

  1. 「ファイルが生成されたら」をきっかけに何か処理をしたいなら、def on_created の中か、その延長上で呼ばれる関数(またはメソッド)にその処理を実装します。

今回のケースであれば、with以降の処理を関数として定義しておき、on_createdの中からそれを呼び出すようにします。ファイル名は引数を通して、イベントのsrc_pathを渡せばよいでしょう。

  1. 「イベントハンドラからクラス外の処理を呼び出す」際、(関数でなく)別のクラスのメソッドを呼び出したいなら、事前にそのイベントハンドラに、処理したいメソッドを持っているクラスのインスタンスを教えてやる必要があります。

今回のケースで、もしそのように実装したい場合、ChangeHandlerのインスタンスを作っている= ChangeHandler()あたりで引数にインスタンスを指定してやり、ChangeHander自身はそのインスタンスを覚えておくようにすればよいでしょう。

なお、イベントハンドラで重たい処理を実装すると、イベント監視が滞る場合があります。watchdogがどのような実装になっているのかまでは調べていないので、どうなるかはここでは回答できませんが、そういうこともあるのだと覚えておいてください。

投稿2019/10/25 09:08

編集2019/10/25 09:12
matobaa

総合スコア2493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takumi_f

2019/11/01 07:55

ありがとうございます。 関数の中に組み込んだら実行できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問