文件系统监控--Python Watchdog模块监控文件时出现重复输出的问题

问题描述

利用Watchdog模块监控目录文件的变化时,会出现以下问题:

1.创建文件时,监控输出为:文件的创建-文件的修改

2.修改文件时,监控输出为:文件的修改-文件的修改

当前监控的目录:./
# 新建文本文档的输出
file created:./新建文本文档.txt
file modified:./新建文本文档.txt
# 修改 新建文本文档的输出
file modified:./新建文本文档.txt
file modified:./新建文本文档.txt
# 修改 test.txt的输出
file modified:./test.txt
file modified:./test.txt

原因分析:

输出重复问题,不是watchdog模块本身的原因.
当写入文件时,它首先创建该文件,然后一次写入一个内容。您所看到的是与这些操作对应的一组事件。有时,这些片段的编写速度足够快,以至于Windows仅为所有片段发送一个事件,而其他时候则获得多个事件。

参考链接

https://blog.csdn.net/Huomaotong/article/details/121187172

https://blog.csdn.net/weixin_39559277/article/details/110903484


解决方案:

问题分析:

第一点:我们对同一文件进行一个操作,而操作系统在极短时间内进行了多项指令,于是watchdog模块的监测输出重复.  

第二点:我们需要根据watchdog的输出,来执行后续的任务..watchdog的重复输出导致任务的输出重复.

解决方案:

问题分析中涉及四个方面: 文件/时间/watchdog/任务块

任务块watchdog类中分离出来,通过 对比文件是否重复 和 监测时间间隔 来决定任务块的执行.  具体实现方式见下面代码.(提示:代码中只涉及文件的创建和修改)

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


path_reference = None  # 文件参照:判断监测输出是不是指向同一文件
time_reference = None  # 时间参照:增加time模块,可以监测对同一文件不同时间的更改


def seng_mail(event, path):  # 任务块
    global path_reference,time_reference
    time_now=time.time()
    if path_reference != path or time_now-time_reference > 3: # 判断语句,时间间隔可更改
        print("file {0}:{1}".format(event, path))
        print('要执行的任务块')
    path_reference = path
    time_reference = time_now


class FileEventHandler(FileSystemEventHandler):  # watchdog类
    def __init__(self):
        FileSystemEventHandler.__init__(self)

    def on_created(self, event):  
        if event.is_directory:
            print("directory created:{0}".format(event.src_path))
        else:
            seng_mail('created', event.src_path) # 调用任务块

    def on_modified(self, event):  
        if event.is_directory:
            print("directory modified:{0}".format(event.src_path))
        else:
            seng_mail('modified', event.src_path) # 调用任务块


if __name__ == "__main__":
    observer = Observer()
    event_handler = FileEventHandler()
    dir = './'
    observer.schedule(event_handler, dir, False)
    print(f"当前监控的目录:{dir}")
    observer.start()
    observer.join()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,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键停止监控器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值