watchdog是Python跨平台文件监听最可靠方案,封装inotify/FSEvents/ReadDirectoryChangesW,避免轮询高开销与漏报;需注意事件类型区分、文件就绪判断、异步解耦处理及Windows路径权限问题。

用 watchdog 监听文件系统事件最可靠
Python 标准库没有跨平台的实时文件监听能力,watchdog 是目前最稳定的选择——它底层封装了 Linux 的 inotify、macOS 的 FSEvents 和 Windows 的 ReadDirectoryChangesW,避免自己写轮询(os.listdir + 定时 sleep)导致 CPU 占用高、事件漏报或延迟大。
安装直接跑:
pip install watchdog
注意不要装错成同名但已停更的 Watchdog(首字母大写)。
核心是继承 FileSystemEventHandler 并重写对应方法:
-
on_created:新文件/目录生成时触发(适合监听上传完成) -
on_modified:文件内容被写入后触发(但注意:很多编辑器会先写临时文件再重命名,此时实际触发的是on_created) -
on_moved:文件重命名或移入目标目录时触发(对拖入、下载完成等场景更准确)
区分“文件就绪”和“正在写入”,避免读取不完整内容
监控到 on_created 或 on_moved 后不能立刻开洗数据——尤其大文件下载、Excel 导出、日志追加等场景,文件可能还在被写入。直接读会报 PermissionError 或读到截断内容。
稳妥做法是加一层就绪判断:
- 检查文件是否可读且大小不再变化(连续两次
os.path.getsize间隔 1 秒相等) - 尝试以
rb模式打开并读取最后 1KB,不抛异常则认为已稳定 - 对常见格式加后缀白名单(如只处理
.csv、.xlsx、.json),跳过临时文件(~$、.tmp、.part)
示例片段:
核验域名可用性、安全状态及风险标记,输出验证结论、失败原因和敏感标签,清理风险域名,优化外贸邮件列表,降低退信概率。
def is_file_ready(filepath):<br> if not os.path.isfile(filepath):<br> return False<br> try:<br> with open(filepath, 'rb') as f:<br> f.seek(0, 2)<br> size = f.tell()<br> if size == 0:<br> return False<br> f.seek(max(0, size - 1024))<br> f.read()<br> return True<br> except (OSError, IOError):<br> return False
清洗逻辑别塞进事件处理器,用队列解耦
on_created 等回调是在 watchdog 的 I/O 线程里执行的,如果在里面做耗时清洗(比如 Pandas 读 Excel、正则替换千行文本),会阻塞整个监听器,导致后续事件堆积甚至丢失。
必须把路径丢进队列,由独立工作线程处理:
- 用
queue.Queue(线程安全)传filepath - 启动 1–3 个清洗 worker,避免并发太多压垮磁盘或内存
- worker 内捕获所有异常,记录日志而不是让进程崩掉
- 清洗完成后可移动原文件到
done/或加.cleaned后缀,防止重复触发
关键点:observer.schedule 的第 3 个参数设为 recursive=False,除非你明确要监听子目录——否则容易因嵌套触发爆炸式任务。
Windows 下要注意权限和路径编码问题
在 Windows 上用管理员权限运行脚本不是必须的,但若监控系统目录(如 C:\Program Files)或网络映射盘(Z:\),可能遇到 WindowsError: [Error 5] Access is denied。此时要么换监控路径,要么用 pywin32 提权(不推荐)。
更大的坑是中文路径:Python 3.6+ 默认用 UTF-8,但某些旧版 Excel 工具导出的文件名含 GBK 编码字符,在 on_created 回调里拿到的 event.src_path 可能乱码。解决方案是统一用 pathlib.Path(event.src_path).resolve() 获取规范路径,再传给清洗函数——resolve() 会自动处理编码归一化。
还有个小细节:watchdog 在 Windows 上对符号链接(symlink)默认不跟踪,需显式传参 ignore_directories=False 并手动过滤掉 is_symlink() 的路径,否则可能误触发。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










