创建文件夹时,请使用Python WatchDog库查看多个事件



我遇到的问题是我想到的其他事件。

我正在看文件夹C:UserskvaskoDownloadsdata。如果我复制一个文件夹2017725LogFile.xml,我会看到以下3个"创建"事件,当我希望只看到1。如果我提前创建日期文件夹结构(但是,当运行的应用程序观看文件夹)将只生成我期望的一个活动。我永远不会为文件夹创建一个活动。就像为创建文件夹生成的事件一样,但是在检查我的on_created(self,event)上的实际事件时,所有三个外观事件看起来完全相同。这里发生了什么?

这是样本输出和最低示例。

2017-09-22 13:58:10,182 - root - INFO - Watchdog: file created C:UserskvaskoDownloadsdata2017725LogFile.xml
2017-09-22 13:58:11,184 - root - INFO - Watchdog: file created C:UserskvaskoDownloadsdata2017725LogFile.xml
2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:UserskvaskoDownloadsdata2017725LogFile.xml

我希望:

2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:UserskvaskoDownloadsdata2017725LogFile.xml

是否有一种方法可以检测其实际上是从文件夹创建的多个事件?

以下是我的观察者配置。

folder = "C:\Users\kvasko\Downloads\data"
observer = Observer(MyProcessHandler(patterns=["*.xml"]), folder, recursive=True)
observer.start_observer()
os.mkdirs("C:\Users\kvasko\Downloads\data\2017\07\25")
shutil.copy2("C:tempLogFile.xml", "C:\Users\kvasko\Downloads\data\2017\07\25")
try:
    while True:
        time.sleep(5)
except:
    print("Error")

以下是我的处理程序课程。

import logging
from watchdog.events import PatternMatchingEventHandler
class MyProcessHandler(PatternMatchingEventHandler):
def on_created(self, event):
    logging.info("Watchdog: file created " + str(event.src_path))

编辑:

这是一个最小工作示例:

import time
import os
import shutil
import datetime
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler
class   TestEventHandler(PatternMatchingEventHandler):
    def on_created(self, event):
        print (str(datetime.datetime.now()) + " " + str(event))
if __name__ == '__main__':
    path = "C:\Temp"
    event_handler = TestEventHandler(patterns=["*.xml"])
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    os.makedirs("C:\Temp\2017\07\25")
    shutil.copy2("C:\Temp2\2017\07\25\test.xml", "C:\Temp\2017\07\25")
    try:
       while True:
           time.sleep(1)
    except KeyboardInterrupt:
       observer.stop()
    observer.join()

打印出来:

2017-09-22 15:49:51.334262 <FileCreatedEvent: src_path='C:\Temp\2017\07\25\test.xml'>
2017-09-22 15:49:52.335468 <FileCreatedEvent: src_path='C:\Temp\2017\07\25\test.xml'>
2017-09-22 15:49:53.340998 <FileCreatedEvent: src_path='C:\Temp\2017\07\25\test.xml'>

edit2:

将on_created()更改为on_any_event()。这就是产生的。

2017-09-23 13:14:57.288792 <FileCreatedEvent: src_path='C:\Temp\2017\07\25\test.xml'>
2017-09-23 13:14:58.291327 <FileCreatedEvent: src_path='C:\Temp\2017\07\25\test.xml'>
2017-09-23 13:14:59.293334 <FileCreatedEvent: src_path='C:\Temp\2017\07\25\test.xml'>
2017-09-23 13:14:59.293334 <FileModifiedEvent: src_path='C:\Temp\2017\07\25\test.xml'>

您可能正在遇到此错误。作为解决方法,您可以使用TestEventHandler类记录创建的最后一个文件路径,而不响应随后的on_created事件除非路径不同于最后创建的路径或该路径已删除:

import time
import os
import shutil
import datetime
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler
class TestEventHandler(PatternMatchingEventHandler):
    def __init__(self, *args, **kwargs):
        super(TestEventHandler, self).__init__(*args, **kwargs)
        self.last_created = None
    def on_created(self, event):
        path = event.src_path        
        if path != self.last_created:
            print(str(datetime.datetime.now()) + " " + str(event))
            self.last_created = path
    def on_deleted(self, event):
        path = event.src_path
        if path == self.last_created:
            self.last_created = None
if __name__ == '__main__':
    path = "C:\Temp"
    target_dir = "C:\Temp\2017\07\25"
    src_dir = "C:\Temp2\2017\07\25"
    filename = 'test.xml'
    target = os.path.join(target_dir, filename)
    src = os.path.join(src_dir, filename)
    event_handler = TestEventHandler(patterns=["*.xml"])
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    if not os.path.exists(target_dir):
        os.makedirs(target_dir)
    if os.path.exists(target):
        os.unlink(target)
    for i in range(3):
        shutil.copy2(src, target_dir)    
    try:
       while True:
           time.sleep(1)
    except KeyboardInterrupt:
       observer.stop()
    observer.join()

最新更新