天天看点

python3文件夹监控模块watchdog学习

网上搜索python的文件夹监控,windows下推荐的大多数都是watchdog,萌新的我就学习了下这个模块。

这模块看了很久的git,没看懂,后来把git的示范代码拉在电脑上跑了一次就懂了,所以对于看不懂各个帖子写的介绍的,建议先把git上官方举例代码拉下来跑一次。

先安装watchdog,watchdog主要使用三个角色:
           

1、Observer

可以通过以下命令导入:

from watchdog.observers import Observer
           

这个模块的作用主要是当作启动和关闭监控程序的,给予文件夹路径后,Observer会监控文件夹的变化并且反馈变化。

2、events

可以通过以下命令导入

from watchdog.events import *
           

这是watchdog的动作模块,具体作用是根据Observer模块反馈的事件分配不一样的操作动作方法,然后程序再继承这个方法开始执行所需的代码。有的萌新会问,为什么Observer反馈了事件还需要events去接收处理,还得再去继承events多麻烦。具体为啥我也不知道,只是官方把Observer事件反馈的结果传给events,events进行分配的。觉得麻烦的大哥可以自己写模块接受Observer结果并处理,萌新的我选择直接继承官方events实列,反正效果差不多。

3、监控文件夹路径了,这个是需要指明实际路径地址的,没啥好解释

我的测试代码:

from watchdog.observers import Observer
from watchdog.events import *




a = r"H:\歌曲库\ACG\影视ACG\加勒比海盗"

class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print("文件被修改了 %s"%event.src_path)

    def on_created(self, event):
        print("文件被创建了 %s" % event.src_path)


if __name__ == "__main__":
    path = a
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()

    try:
        while True:
            time.sleep(1)

    except KeyboardInterrupt:
        observer.stop()
    observer.join()
           

在监控目录下进行新建文件夹和删除文件夹操作结果:

python3文件夹监控模块watchdog学习

有没有仔细看我对events模块导入的是 所有的类?实际上使用的主要是:

FileSystemEventHandler这个类
           

点开events模块:

python3文件夹监控模块watchdog学习

类有很多个,简单用不到其他类的可以只导入这一个就行了 ,这个类官方是咋写的呢?看下图:

python3文件夹监控模块watchdog学习

你会发现除了 dispatch 下面有内容,这个类的其他方法都是空的

这里dispatch决定了接收到Observer动作后转发给那个方法操作,而on_any_event 呢会首先被dispatch调用,之后才会分配给其他的方法。这里的所有方法都是空的,目的就是让我们自行继承这个类然后执行我们自己的代码。由于已经把动作分配好了,比如我新建文件夹,只会调用create,或者移动文件夹只会调用move,所以根据相关动作继承该方法后在方法里面写需要执行的代码即可实现监控和监控操作。

回过头看我代码的执行结果,我只是在定义目录路径的子文件夹内创建了一个新文件夹,这里我继承了两个方法,一个是modified更新动作的方法,一个是create新建动作的方法,放我新建一个文件夹时两个方法都被调用了,能理解父文件夹被更新的动作是因为有子文件夹创建,但是子文件夹创建后也被调用了一次更新,所以在继承方法的时候建议自己调试两次,根据自己需求选择需要继承的方法。

经测试,文件的打开动作都算作更新,比如播放一首歌,点开一次就会打印一条更新记录,播放完后关闭也算一条更新记录,更新的权限范围限制很低。