python中文件变化监控示例(watchdog)


Posted in Python onOctober 16, 2017

在python中文件监控主要有两个库,一个是pyinotify ( https://github.com/seb-m/pyinotify/wiki ),一个是watchdog(http://pythonhosted.org/watchdog/)。pyinotify依赖于Linux平台的inotify,后者则对不同平台的的事件都进行了封装。因为我主要用于Windows平台,所以下面着重介绍watchdog(推荐大家阅读一下watchdog实现源码,有利于深刻的理解其中的原理)。

watchdog在不同的平台使用不同的方法进行文件检测。在init.py中发现了如下注释:

|Inotify| Linux 2.6.13+ ``inotify(7)`` based observer
|FSEvents| Mac OS X FSEvents based observer
|Kqueue| Mac OS X and BSD with kqueue(2) ``kqueue(2)`` based observer
|WinApi|(ReadDirectoryChangesW) MS Windows Windows API-based observer
|Polling| Any fallback implementation

给出示例代码如下:

from watchdog.observers import Observer
from watchdog.events import *
import time

class FileEventHandler(FileSystemEventHandler):
def __init__(self):
FileSystemEventHandler.__init__(self)

def on_moved(self, event):
if event.is_directory:
print("directory moved from {0} to {1}".format(event.src_path,event.dest_path))
else:
print("file moved from {0} to {1}".format(event.src_path,event.dest_path))

def on_created(self, event):
if event.is_directory:
print("directory created:{0}".format(event.src_path))
else:
print("file created:{0}".format(event.src_path))

def on_deleted(self, event):
if event.is_directory:
print("directory deleted:{0}".format(event.src_path))
else:
print("file deleted:{0}".format(event.src_path))

def on_modified(self, event):
if event.is_directory:
print("directory modified:{0}".format(event.src_path))
else:
print("file modified:{0}".format(event.src_path))

if __name__ == "__main__":
observer = Observer()
event_handler = FileEventHandler()
observer.schedule(event_handler,"d:/dcm",True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()

watchdog主要采用观察者模型(废话,从变量命名就可以看出来)。主要有三个角色:observer,event_handler,被监控的文件夹。三者原本是独立的,主要通过observer.schedule函数将三者串起来,意思为observer不断检测调用平台依赖代码对监控文件夹进行变动检测,当发现改变时,通知event_handler处理。最后特别推荐读者有时间可以阅读一下watchdog的源码,写的易懂而且架构很好。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用MySQLdb for Python操作数据库教程
Oct 11 Python
Python自动化运维_文件内容差异对比分析
Dec 13 Python
Python使用zip合并相邻列表项的方法示例
Mar 17 Python
Django自定义过滤器定义与用法示例
Mar 22 Python
Python生成短uuid的方法实例详解
May 29 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
python操作excel文件并输出txt文件的实例
Jul 10 Python
Django使用模板后无法找到静态资源文件问题解决
Jul 19 Python
Python 导入文件过程图解
Oct 15 Python
python和php哪个更适合写爬虫
Jun 22 Python
Python 创建TCP服务器的方法
Jul 28 Python
python自动化办公操作PPT的实现
Feb 05 Python
python中import reload __import__的区别详解
Oct 16 #Python
使用Python操作excel文件的实例代码
Oct 15 #Python
python出现"IndentationError: unexpected indent"错误解决办法
Oct 15 #Python
python 二分查找和快速排序实例详解
Oct 13 #Python
Python实现的排列组合计算操作示例
Oct 13 #Python
python numpy函数中的linspace创建等差数列详解
Oct 13 #Python
Python配置mysql的教程(推荐)
Oct 13 #Python
You might like
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php下目前为目最全的CURL中文说明
2010/08/01 PHP
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
PHP实现的下载远程文件类定义与用法示例
2017/07/05 PHP
javascript 自动填写表单的实现方法
2010/04/09 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
js相册效果代码(点击创建即可)
2013/04/16 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
调用innerHTML之后onclick失效问题的解决方法
2014/01/28 Javascript
div失去焦点事件实现思路
2014/04/22 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
深入理解JavaScript中的浮点数
2016/05/18 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
Angular网络请求的封装方法
2018/05/22 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
[00:11]战神迅矛
2019/03/06 DOTA
Python编写检测数据库SA用户的方法
2014/07/11 Python
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
python并发编程之线程实例解析
2017/12/27 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
城管综合整治方案
2014/05/01 职场文书
Java使用HttpClient实现文件下载
2022/08/14 Java/Android