【问题标题】:Check specific file has been modified using python watchdog使用 python 看门狗检查特定文件是否已被修改
【发布时间】:2015-08-31 14:46:01
【问题描述】:

我想知道如何检查文件夹下特定文件的更改。我发现看门狗模块可以检查文件夹中文件的更改,但我只需要 1 个文件(具有固定名称)。

请帮忙解决这个问题,谢谢。

class MyHandler(FileModifiedEvent):
    def on_modified(self, event):

if __name__ == "__main__":
        integrity_file_path = DATASTORE_DIRECTORY_PATH + '/schedule.xml'
        event_handler = MyHandler()
        observer = Observer()
        observer.schedule(MyHandler(), path=integrity_file_path,recursive=True)
        observer.start()

        try:
            while True:
                time.sleep(5)
        except KeyboardInterrupt:
            observer.stop()
        observer.join()

【问题讨论】:

    标签: python file watchdog


    【解决方案1】:

    您可以子类化watchdog.events.PatternMatchingEventHandler 事件处理程序并对其进行修改以在发生事件时执行您想要的任何操作。 您可以将 pattern 设置为要监控的文件名。

    但是,这个有点棘手。在幕后,它使用pathtools.patterns 进行模式匹配。 它还将目录附加到正在匹配的模式中。这意味着您需要将文件的完整路径作为文件名 "pattern" 参数传递给事件处理程序。 否则,模式匹配将失败,您将不会收到任何事件通知。

    下面是一个例子:

    import sys, os.path, time, logging
    from watchdog.observers import Observer
    from watchdog.events import PatternMatchingEventHandler
    
    
    class MyEventHandler(PatternMatchingEventHandler):
        def on_moved(self, event):
            super(MyEventHandler, self).on_moved(event)
            logging.info("File %s was just moved" % event.src_path)
    
        def on_created(self, event):
            super(MyEventHandler, self).on_created(event)
            logging.info("File %s was just created" % event.src_path)
    
        def on_deleted(self, event):
            super(MyEventHandler, self).on_deleted(event)
            logging.info("File %s was just deleted" % event.src_path)
    
        def on_modified(self, event):
            super(MyEventHandler, self).on_modified(event)
            logging.info("File %s was just modified" % event.src_path)
    
    def main(file_path=None):
        logging.basicConfig(level=logging.INFO,
            format='%(asctime)s - %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S')
        watched_dir = os.path.split(file_path)[0]
        print 'watched_dir = {watched_dir}'.format(watched_dir=watched_dir)
        patterns = [file_path]
        print 'patterns = {patterns}'.format(patterns=', '.join(patterns))
        event_handler = MyEventHandler(patterns=patterns)
        observer = Observer()
        observer.schedule(event_handler, watched_dir, recursive=True)
        observer.start()
        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            observer.stop()
        observer.join()
    
    
    
    if __name__ == "__main__":
        if len(sys.argv) > 1:
            path = sys.argv[1]
            main(file_path=path.strip())
        else:
            sys.exit(1)
    

    执行看门狗python脚本(修改文件前):

    (stackoverflow)[root@joeyoung.io stackoverflow]# python watchschedule.py /usr/local/src/stackoverflow/watchdog/schedule.xml
    watched_dir = /usr/local/src/stackoverflow/watchdog
    patterns = /usr/local/src/stackoverflow/watchdog/schedule.xml
    

    在单独的控制台中修改 schedule.xml 文件:

    [root@joeyoung.io watchdog]# echo "I just modified this file" >> schedule.xml
    

    修改 schedule.xml 后的结果:

    (stackoverflow)[root@joeyoung.io stackoverflow]# python watchschedule.py /usr/local/src/stackoverflow/watchdog/schedule.xml
    watched_dir = /usr/local/src/stackoverflow/watchdog
    patterns = /usr/local/src/stackoverflow/watchdog/schedule.xml
    2015-08-31 19:30:31 - File /usr/local/src/stackoverflow/watchdog/schedule.xml was just modified
    

    【讨论】:

    • 这工作如广告,谢谢。我将如何消除在命令行中输入文件结构的需要?似乎没有任何效果。我已经尝试了 main 函数中三个最合乎逻辑的地方。
    • @ElliotRobert 您可以硬编码文件路径。在 if __name__ == "__main__": 部分下,删除整个 if-else 块并将其替换为对 main() 函数的调用,将硬编码路径作为参数传递给 main()。例如:main(file_path='/usr/local/src/stackoverflow/watchdog/schedule.xml')
    • 这只适用于它自己的目录,包括文件名会导致错误,我必须在带有文件名的完整路径上运行 .strip() 函数才能工作。谢谢一百万乔。
    【解决方案2】:

    我想说你可以根据

    检查文件的修改时间

    How to get file creation & modification date/times in Python?

    定义一个阈值并将当前时间与修改时间进行比较,您可能会知道文件是否更新。如果文件没有被超级频繁地修改,这将起作用。

    但是无论如何,如果有人打开文件,输入一些垃圾然后删除并保存,就会出现误报。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多