質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

3回答

1286閲覧

pythonのwatchdogで更新されたファイルのパスを取得したい

curry_pan

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2022/12/22 11:59

実現したいこと

pythonのwatchdogで更新されたcsvファイルのパスを取得したいと考えています。
具体的には、得たパスをほかの関数に用いるためwatchdogで取得したパスをreturnで返す必要があります。
しかし、watchdogでどのようにパスを取得すればよいかわかりません。
パス自体は下のコードにあるようにevent.src_pathを用いればよいことは把握しております。

python自体学びたての初心者ですのでわからない点が多いですが、教えていただけると幸いです。

該当のソースコード

python

1import time 2from argparse import ArgumentParser 3 4from watchdog.events import PatternMatchingEventHandler 5from watchdog.observers import Observer 6 7 8 9def main(): 10 """メイン関数""" 11 # ===== ArgumentParserの設定 12 parser = ArgumentParser(description="Monitoring Tool") 13 # 引数の処理 14 parser.add_argument("-p", "--path", action="store", dest="path", help="監視対象パス") 15 # コマンドライン引数のパース 16 args = parser.parse_args() 17 # 引数の取得 18 path = args.path 19 # pathの指定がない場合は実行ディレクトリに設定 20 if path is None: 21 path = "." 22 23 # モニター実行 24 # monitor(path) 25 26 patterns = ['*.csv'] 27 event_handler = PatternMatchingEventHandler(patterns) 28 29 def on_created(event): 30 filepath = event.src_path 31 # filename = os.path.basename(filepath) 32 # print("%s is created"%filename) 33 print(event) 34 print(filepath) 35 36 37 event_handler.on_created = on_created 38 39 observer = Observer() 40 observer.schedule(event_handler, path, recursive=True) 41 observer.start() 42 try: 43 while True: 44 time.sleep(1) 45 except KeyboardInterrupt: 46 observer.stop() 47 observer.join()

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

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

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

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

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

yuma.inaura

2022/12/22 12:51

既に print(filepath) の部分で他の関数 (print) に値を渡せていると思うのですが、どこが足りないんでしょうか? return で渡す必要はないですよね
curry_pan

2022/12/22 12:57

これとはまた別の親関数にファイルのパスを渡したいと考えています。 初心者なのでイメージが正しいかはわかりませんが、def on_createdの外側にファイルパスを出したいといった感じです。
guest

回答3

0

最終的には以下のような方法で解決いたしました。
回答にはcallbackなる引数があることでwatch関数の引数が3つになっていましたが、必要がなかったので引数を2つに変更いたしました。
かなりすっきりとしたコードになったと思いましたので、個人的には満足しております。

python

1import time 2 3from watchdog.events import PatternMatchingEventHandler 4from watchdog.observers import Observer 5 6# 行いたい関数をimportするなりして実装 7def foo_print(text): #パスを取得して行いたい関数 8 print("aa") 9 print(text) 10 11class MyHandler(PatternMatchingEventHandler): 12 def __init__(self, patterns): 13 super(MyHandler, self).__init__(patterns=patterns) 14 15 def on_created(self, event): 16 filepath = event.src_path 17 foo_print(filepath) 18 19 20def watch(path): 21 # モニター実行 22 extensions = ["*.csv"] 23 event_handler = MyHandler(extensions) 24 observer = Observer() 25 observer.schedule(event_handler, path, recursive=True) 26 observer.start() 27 try: 28 while True: 29 time.sleep(1) 30 except KeyboardInterrupt: 31 observer.stop() 32 observer.join() 33 34 35if __name__ == "__main__": 36 path = "./" 37 watch(path)

投稿2022/12/23 04:22

curry_pan

総合スコア1

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

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

0

ベストアンサー

他の関数 foo_print にファイルパスを渡す例
こういうことなんでしょうか

( say_hello 関数は気にしないでください )

python

1import time 2from watchdog.observers import Observer 3from watchdog.events import PatternMatchingEventHandler 4 5def foo_print(text): 6 print(text) 7 8class WatchdogHandler(PatternMatchingEventHandler): 9 def __init__(self, callback, patterns): 10 super(WatchdogHandler, self).__init__(patterns=patterns) 11 self.callback = callback 12 13 def __callback_handler(self, func,*args): 14 return func(*args) 15 16 def on_created(self, event): 17 foo_print(event.src_path) 18 self.__callback_handler(self.callback) 19 20def watch(path, callback, extensions): 21 event_handler = WatchdogHandler(callback, extensions) 22 observer = Observer() 23 observer.schedule(event_handler, path, recursive=True) 24 observer.start() 25 try: 26 while True: 27 time.sleep(1) 28 except KeyboardInterrupt: 29 observer.stop() 30 observer.join() 31 32def say_hello(): 33 print("hello") 34 35if __name__ == "__main__": 36 dir_to_watch = "./" 37 extensions = ["*"] 38 watch(dir_to_watch, say_hello, extensions) 39

参考 https://101010.fun/programming/python-watchdog-event.html

投稿2022/12/22 13:08

yuma.inaura

総合スコア1451

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

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

curry_pan

2022/12/22 13:18

ご回答ありがとうございます。 頂いたコードで確認したところ、やりたいことは間違いなくそのようなことです。 他の関数にパスを渡すのではなく、ほかの関数を持ってくればよかったのですね。 コールバック関数というものが何なのかはコードを読んだり、解説を読んでみてもいまいち掴めませんでしたが、とても勉強になりました。 ありがとうございました。
curry_pan

2022/12/22 13:20

一つ質問なのですが、watch()内のsay_hello関数は何をしているのでしょうか。明らかに必要ないのでwatch関数の引数から取り除いてもよいのでしょうか。
yuma.inaura

2022/12/22 14:33

解決したようで良かったです say helloはイベント情報なしで実行されるコールバックとかですかね? ほぼ参考サイトから持ってきたコードなので適宜調整してみてください
curry_pan

2022/12/23 03:14

イベント情報なしの関数が必要な理由が分からないので、改めて勉強してみます。ありがとうございました。
guest

0

コールバック関数は値を返せないので他の方法が必要です。
たとえば、親関数の変数を使って値を渡します。

python

1 changed_filepath = '' 2 def on_created(event): 3 nonlocal changed_filepath 4 changed_filepath = event.src_path

投稿2022/12/22 12:29

TakaiY

総合スコア12657

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

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

curry_pan

2022/12/22 12:44

ご回答いただきありがとうございます。 親関数の変数として扱う方法があるんですね。知りませんでした。 いただいたコードをコピーして↓のように実行してみましたが、パスを表示しません。 なぜなのでしょうか? 初心者質問で大変恐縮ですが、ご返信いただけると幸いです。 ``` changed_filepath = '' def on_created(event): nonlocal changed_filepath changed_filepath = event.src_path event_handler.on_created = on_created print(changed_filepath) ```
TakaiY

2022/12/22 14:16

そのタイミングでは、まだ、on_createdが呼ばれていないので、changed_filepathには何も入っていませんよ。 ファイルが更新されて、標準出力にそれが出た後、main関数内で取得可能です。 値はいつどのように使うのかによって処理を作る必要がありますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問