python 监控文件变化 - python watchdog模块使用方法

很多时候我们希望根据一个文件目录下文件和文件夹的变化情况,做出相应的响应。当然我们无需每时每刻都去扫描该文件目录,python watchdog 模块提供了这方面的功能。Watchdog用于监控一个文件目录下的文件和文件夹的变动,包括文件和文件夹的增删改,移动等。

watchdog是github上的一个开源项目,源码见这里,采用观察者模式。watchdog 提供了对于不同操作系统的支持,在源码路径中master/src/watchdog/observers/__init__.py的注释说明了对于如下操作系统的支持:

============== ================================ ==============================
Class          Platforms                        Note
============== ================================ ==============================
|Inotify|      Linux 2.6.13+                    ``inotify(7)`` based observer
|FSEvents|     Mac OS X                         FSEvents based observer
|Kqueue|       Mac OS X and BSD with kqueue(2)  ``kqueue(2)`` based observer
|WinApi|       MS Windows                       Windows API-based observer
|Polling|      Any                              fallback implementation
============== ================================ ==============================

可以看到对于包括window,linux以及MAC os都提供了支持,可以放心使用。

如下是对于该模块的使用示例:

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

class FileEventHandler(FileSystemEventHandler):
    def __init__(self):
        FileSystemEventHandler.__init__(self)

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

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

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

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

    def task(self,filName):
        print(filename)
        #具体任务

if __name__ == "__main__":
    observer = Observer()
    event_handler = FileEventHandler()
    filePath = '/data/pcap'
    observer.schedule(event_handler,filePath,True)
    observer.start()

    time.sleep(100)

    observer.stop()
    observer.join()

可以看到使用起来也是非常的简单:

1,重新定义一个类继承FileSystemEventHandler类,重载四个事件函数即可。这四个函数对应的是文件的增删改,移动等事件。

2,以on_moved函数为例,在该函数中处理对于文件移动事件的响应,我调用的是task函数,该函数可以根据实际的需求进行修改。

3,将新类的对象,监控的文件目录作为参数传入observer.schedule函数,filePath即监控的文件目录,event_handler对象对于文件事件做出处理。

4,observer.start()启动之后,一直是监听状态,除非显示的退出。我的示例程序中在监听100s之后退出,可以根据自身情况进行修改。

使用过程中的注意事项:

1,文件创建的动作其实会触发多种事件,包括FileCreatedEvent以及FileModifiedEvent时间,触发on_created以及on_modified函数,这是需要注意的。原因在于f = open(… , ‘w’) 这样文件创建动作会触发FileCreatedEvent事件,执行on_created函数; 在往文件些数据的时候例如f.flush() 和f.close()操作 会触发FileModifiedEvent事件,执行on_modified函数。

2,前面也提到不同的操作系统平台基于不同的observer,在文件处理方面也可能会存在差异,因此对于不同的平台,最好详细测试一下文件的创建,写入,关闭的个操作会触发什么事件。

3,我的业务场景是监控文件夹下面pcap报文的情况,并解码报文。我在Linux平台上的策略是在写数据的时候,我的文件名是xxx,在文件写完之后,我将文件名修改成为xxx.pcap。这个时候文件名的修改会触发文件移动事件,那么这个时候我在on_moved函数中执行对于pcap报文的解析就可以了。对于文件创建写入引发的修改和创建事件忽略即可。

4,在实际处理过程中watchdog的对于事件的响应还是非常的及时。

上述就是watchdog的简单的使用经验。

本文为CSDN村中少年原创文章,转载记得加上原创出处,博主链接这里

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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、付费专栏及课程。

余额充值