Python 监控文件系统变化:Watchdog
·
在 Python 中,watchdog 通常指的是一个用于 监控文件系统变化 的第三方库。它可以监听文件或目录的创建、修改、删除等事件,并触发相应的回调函数。
下面是 watchdog 的核心概念和用法:
1️⃣ 安装
pip install watchdog
2️⃣ 基本使用
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
# 自定义事件处理器
class MyHandler(FileSystemEventHandler):
def on_modified(self, event):
print(f"文件被修改: {event.src_path}")
def on_created(self, event):
print(f"文件被创建: {event.src_path}")
def on_deleted(self, event):
print(f"文件被删除: {event.src_path}")
# 设置监控目录
path = "./test_folder"
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True) # recursive=True 递归子目录
# 启动监控
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
3️⃣ 核心类说明
| 类/函数 | 功能 |
|---|---|
Observer |
监控线程,用于观察指定目录 |
FileSystemEventHandler |
事件处理基类,用户可以继承并重写事件方法 |
on_modified(event) |
文件或目录被修改时触发 |
on_created(event) |
文件或目录被创建时触发 |
on_deleted(event) |
文件或目录被删除时触发 |
schedule(handler, path, recursive) |
为某个路径绑定事件处理器 |
4️⃣ 小提示
recursive=True可以监控子目录,否则只监控指定目录。event.src_path可以获取触发事件的文件或目录路径。- 可以结合 多线程 或 异步处理 做更复杂的自动化任务。
自动处理新文件的 Watchdog 示例
这个示例会实现:
- 监控一个目录(例如
./watch_folder) - 当有新文件被创建时自动移动到另一个目录(例如
./processed) - 并打印日志
import os
import time
import shutil
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
# 1️⃣ 自定义事件处理器
class FileHandler(FileSystemEventHandler):
def __init__(self, dest_folder):
self.dest_folder = dest_folder
os.makedirs(dest_folder, exist_ok=True)
def on_created(self, event):
# 忽略目录,只处理文件
if event.is_directory:
return
src_path = event.src_path
filename = os.path.basename(src_path)
dest_path = os.path.join(self.dest_folder, filename)
# 移动文件到目标文件夹
try:
shutil.move(src_path, dest_path)
print(f"[INFO] 文件已处理: {filename} -> {self.dest_folder}")
except Exception as e:
print(f"[ERROR] 移动文件失败: {filename}, {e}")
# 2️⃣ 配置监控目录
watch_folder = "./watch_folder"
processed_folder = "./processed"
# 3️⃣ 创建 Observer 并绑定事件
event_handler = FileHandler(processed_folder)
observer = Observer()
observer.schedule(event_handler, watch_folder, recursive=False)
# 4️⃣ 启动监控
observer.start()
print(f"[INFO] 正在监控目录: {watch_folder}")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
✅ 功能说明
- 自动创建目录:如果目标目录不存在,会自动创建。
- 只处理文件:不会对目录触发事件。
- 异常处理:移动文件失败会打印错误日志。
- 可扩展:你可以在
on_created中加处理逻辑,比如读取 CSV、生成报告、上传到云端等。
更多推荐
所有评论(0)