Python学习笔记-文件监控watchdog

文件监控-watchdog

一、概述

python watchdog模块用于监控一个文件目录下的文件和文件夹的变动,包括文件和文件夹的增删改移。

watchdog针对不同的平台都进行了封装,不仅可以监视windows,还可以监视linux的文件系统。

二、文件系统事件基类类型定义

watchdog.events.FileSystemEvent(event_type,src_path,is_directory=False):

  • event.event_type:时间类别,moved deleted created modified
  • event.src_path:触发该事件的文件或者目录的路径
  • event.is_directory:该事件是否由一个目录触发

三、由watchdog.events.FileSystemEvent基类派生的子类如下

  • watchdog.events.FileDeletedEvent() 文件被删除时触发该事件
  • watchdog.events.DirDeletedEvent() 目录被删除时触发该事件
  • watchdog.events.DirCreatedEvent() 目录被建立时触发该事件
  • watchdog.events.FileCreatedEvent() 文件被建立时触发该事件
  • watchdog.events.FileModifiedEvent() 文件被修改时触发该事件
  • watchdog.events.DirModifiedEvent() 目录被修改触发该事件
  • watchdog.events.FileMovedEvent() 文件被移动触发该事件
  • watchdog.events.DirMovedEvent() 目录被移动触发该事件

四、文件系统事件处理类watchdog.events.FileSystemEventHandler

该类是事件处理器的基类,用于处理时间,使用者需要继承该类,并在子类中重写对应方法,需要重写的方法

1.self.on_any_event(event)
任何事件发生都会首先执行该方法,该方法预设为空,dispatch()方法会先执行该方法,然后将event分派给其他方法进行处理

2.self.on_moved(event)
处理DirMovedEvent和FileMovedEvent事件,预设为空

3.self.on_created(event)
处理DirCreated和FileCreatedEvent事件 预设为空

4.self.on_deleted(event)
处理DirDeletedEvent和FileDeletedEvent事件,预设为空

5.self.on_modified(event)
处理DirModifiedEvent和FileModifiedEvent事件,预设为空

以上方法需要用到event的几个属性:

  • event.is_directory:触发事件的是否为资料夹
  • event.src_path:源路径
  • event.dest_path:目标路径

下面是一个简单的例子:

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

class FileEventHandler(FileSystemEventHandler):
    def on_any_event(self, event):
    pass

    def on_moved(self, event):
    if event.is_directory:
    print("directory moved from {0} to {1}".format(event.src_path,event.dest_path))
    else:
    print("file moved from {0} to {1}".format(event.src_path,event.dest_path))

    def on_created(self, event):
    if event.is_directory:
    print("directory created:{0}".format(event.src_path))
    else:
    print("file created:{0}".format(event.src_path))

    def on_deleted(self, event):
    if event.is_directory:
    print("directory deleted:{0}".format(event.src_path))
    else:
    print("file deleted:{0}".format(event.src_path))

    def on_modified(self, event):
    if event.is_directory:
    print("directory modified:{0}".format(event.src_path))
    else:
    print("file modified:{0}".format(event.src_path))

if __name__ == "__main__":
    import time
    observer = Observer()
    event_handler = FileEventHandler()
    observer.schedule(event_handler, r"D:\XufiveGit\PEC\client", True)
    observer.start()
    try:
    while True:
    time.sleep(1)

    except KeyboardInterrupt:
    observer.stop()

补充说明:python中format方法将指定的值格式化并将它们插入到字符串的占位符中。上述代码中传入的是源路径和目标路径。

使用方法非常简单,重新定一个类FileEventHandler()继承FileSystemEventHandler类,重写四个函数,这四个函数对应文件或者目录的增删改查。

定义Observer()对象,定义FileEventHandler()对象,然后使用observer函数的对象调用schedule函数,将监控的文件目录以及FileEventHandler传入该函数,event_handler对象对于文件时间作出处理,filePath即监控的文件目录。

observer.start()启动之后,一直是处于监听的状态,除非指示退出,该程序使用time.sleep(1)保证暂停一秒(监听频率),之后发生KeyboardInterrupt异常,停止监听。

文件创建的动作其实会触发多种事件,包括FileCreatedEvent以及FileModifiedEvent事件,触发FileEventHander中重写的on_created函数以及on_modified函数,这些事需要注意的,原因在于f=open()这样的文件操作会触发FileCreatedEvent事件,执行on_created函数,文件操作f.flush()和f.close()操作会触发FileModifiedEvent事件,执行on_modified函数。

五、总结

watchdog主要采用观察者模型。主要有三个角色:observer,event_handler,被监控的文件夹。三者原本是独立的,主要通过observer.schedule函数将三者串起来,意思为observer不断检测调用平台依赖代码对监控文件夹进行变动检测,当发现改变时,通知event_handler处理

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
是的,Python可以使用watchdog库来监控文件系统。watchdog库可以监控文件和目录的创建、删除、修改和移动等操作,并在这些事件发生时触发相应的回调函数。具体来说,可以通过以下步骤来使用watchdog监控文件系统: 1. 安装watchdog库:可以通过pip命令来安装watchdog库,如下所示: ``` pip install watchdog ``` 2. 创建监控处理类:需要创建一个类,并继承watchdog.events.FileSystemEventHandler类,以处理文件系统事件。可以在这个类中实现on_created、on_deleted、on_modified和on_moved等方法,以处理相应的事件。 3. 创建监控器对象:需要创建一个监控器对象,并指定要监控的目录和处理类。可以使用watchdog.observers.Observer类来创建监控器对象。 4. 启动监控器:需要调用监控器对象的start方法来启动监控器。在监控器启动后,它将持续监控目录中的文件系统事件,并在事件发生时调用相应的处理类方法。 下面是一个简单的示例代码,演示如何使用watchdog监控文件系统: ```python import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler class MyHandler(FileSystemEventHandler): def on_created(self, event): if event.is_directory: print("Directory created: {}".format(event.src_path)) else: print("File created: {}".format(event.src_path)) if __name__ == "__main__": event_handler = MyHandler() observer = Observer() observer.schedule(event_handler, path='.', recursive=False) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() ``` 在这个示例中,我们创建了一个名为MyHandler的处理类,它继承自FileSystemEventHandler类,并实现了on_created方法,以处理文件创建事件。然后,我们创建了一个监控器对象,并将其与处理类关联起来,指定要监控的目录为当前目录。最后,我们启动了监控器,并持续运行,直到用户按下Ctrl+C键停止监控器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少写代码少看论文多多睡觉

求打赏,求关注,求点赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值