Python中watchdog.observersObserver()教程:实时监控文件夹变化
watchdog是Python中一个用于监控文件系统变化的库,可以用于实时监控文件夹中的文件和子文件夹的新建、删除、修改等操作。它提供了一个观察者模式来处理文件系统事件,并通过回调函数来处理文件系统变化。
使用watchdog库进行文件夹监控需要以下几个步骤:
1. 安装watchdog库:使用pip命令可以很方便地安装watchdog库。在命令行中输入以下命令进行安装:
pip install watchdog
2. 导入所需的模块:在Python脚本中,首先需要导入watchdog库的相关模块,包括observer、events和handlers。
from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler
3. 编写处理文件系统变化的回调函数:使用FileSystemEventHandler类的子类来定义处理文件系统变化的回调函数,并重写需要的方法。常用的方法包括on_created、on_deleted、on_modified和on_moved。下面是一个简单的回调函数的示例:
class MyHandler(FileSystemEventHandler):
def on_created(self, event):
if event.is_directory:
print(f"Directory created: {event.src_path}")
else:
print(f"File created: {event.src_path}")
def on_deleted(self, event):
if event.is_directory:
print(f"Directory deleted: {event.src_path}")
else:
print(f"File deleted: {event.src_path}")
def on_modified(self, event):
if event.is_directory:
print(f"Directory modified: {event.src_path}")
else:
print(f"File modified: {event.src_path}")
def on_moved(self, event):
if event.is_directory:
print(f"Directory moved from {event.src_path} to {event.dest_path}")
else:
print(f"File moved from {event.src_path} to {event.dest_path}")
4. 创建观察者对象并启动监控:使用Observer类来创建一个观察者对象,并将回调函数对象传递给观察者对象。可以使用schedule()方法来添加需要监控的文件夹或文件,并通过start()方法启动监控。
if __name__ == "__main__":
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path='/path/to/folder', recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
在上面的示例中,我们创建了一个观察者对象observer,并将回调函数对象event_handler传递给观察者对象。使用schedule()方法来添加需要监控的文件夹或文件,其中path参数为待监控的文件夹路径,recursive参数为是否递归监控子文件夹。最后使用start()方法启动监控。
5. 停止监控:可以通过stop()方法停止监控,并通过join()方法等待观察者结束。
observer.stop() observer.join()
通过以上步骤,我们可以实现对文件夹的实时监控,并对文件系统变化进行相应的处理。
下面是一个完整的使用watchdog库进行文件夹监控的示例:
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(f"Directory created: {event.src_path}")
else:
print(f"File created: {event.src_path}")
def on_deleted(self, event):
if event.is_directory:
print(f"Directory deleted: {event.src_path}")
else:
print(f"File deleted: {event.src_path}")
def on_modified(self, event):
if event.is_directory:
print(f"Directory modified: {event.src_path}")
else:
print(f"File modified: {event.src_path}")
def on_moved(self, event):
if event.is_directory:
print(f"Directory moved from {event.src_path} to {event.dest_path}")
else:
print(f"File moved from {event.src_path} to {event.dest_path}")
if __name__ == "__main__":
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path='/path/to/folder', recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
在该示例中,我们创建了一个观察者对象observer,并使用schedule()方法将回调函数对象event_handler添加到观察者中。需要将/path/to/folder替换为实际的文件夹路径。然后通过start()方法开始监控,并通过while循环持续运行。可以通过键盘中断(Ctrl+C)来停止监控。
总结:watchdog是一个非常有用的库,可以实现对文件夹变化的实时监控。通过回调函数可以对文件系统事件进行相应的处理,例如打印出变化的文件或文件夹路径。以上是一个简单的watchdog库的教程,希望能对你有所帮助。
