1. 先下载对应库:
pip install watchdog
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandlerclass FileChangeHandler(FileSystemEventHandler):def on_modified(self, event):# 当文件被修改时触发此方法if not event.is_directory:print(f'文件 {event.src_path} 被修改')if __name__ == "__main__":# 要监视的目录路径#这里填写具体的目录位置信息,不是具体到某个文件夹path_to_monitor = '.' # 这里可以将 '.' 替换为你要监控的实际目录路径event_handler = FileChangeHandler()observer = Observer()# 将事件处理程序与要监视的路径关联起来,并设置递归监视(包括子目录)observer.schedule(event_handler, path_to_monitor, recursive=True) observer.start() # 启动观察者try:while True:time.sleep(1) # 保持程序运行,持续监听except KeyboardInterrupt:observer.stop() # 按 Ctrl+C 停止监听observer.join() # 等待观察者线程结束
上述代码具体解析:
2. 定义了一个继承自 FileSystemEventHandler 的类 FileChangeHandler,并重写了 on_modified 方法,用于处理文件修改事件
3. 在 main 部分,首先指定要监视的目录路径(path_to_monitor)。
3.1 创建 FileChangeHandler 的实例 event_handler 和 Observer 的实例 observer。
3.2 使用 observer.schedule 方法将事件处理程序与要监视的路径关联起来,并通过设置 recursive=True 来递归监视目录及其子目录中的文件变化。
3.3 调用 observer.start 启动观察者,使其开始监听文件系统事件。
3.4 使用一个无限循环保持程序运行,以便持续监听文件系统的变化。当按下 Ctrl+C 时,捕获 KeyboardInterrupt 异常,调用 observer.stop 停止观察者,并使用 observer.join 等待观察者线程结束。
4. recursive具体说明
当 recursive=True 时(这是默认情况),如果 path
是一个目录,那么不仅会监控该目录本身的变化,还会递归地监控其所有子目录的变化,即子目录中的文件和子目录的创建、修改、删除、移动等操作都会触发相应的事件。
而当 recursive=False 时,如果 path
是一个目录,只会监控该目录本身的变化,不会深入监控其子目录中的文件和子目录的变化。如果 path 是一个文件,则无论 recursive
的值如何,都只会监控该文件的变化。