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抓取Discuz!用户名脚本代码
Dec 30 Python
Python实现豆瓣图片下载的方法
May 25 Python
如何使用python爬取csdn博客访问量
Feb 14 Python
对pandas数据判断是否为NaN值的方法详解
Nov 06 Python
pymongo中聚合查询的使用方法
Mar 22 Python
python中的print()输出
Apr 12 Python
Python Django Cookie 简单用法解析
Aug 13 Python
Python切图九宫格的实现方法
Oct 10 Python
Pytorch 实现sobel算子的卷积操作详解
Jan 10 Python
TensorFlow自定义损失函数来预测商品销售量
Feb 05 Python
公认8个效率最高的爬虫框架
Jul 28 Python
Python采集壁纸并实现炫轮播
Apr 30 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
PHPMyAdmin 快速配置方法
2009/05/11 PHP
教你如何解密 “ PHP 神盾解密工具 ”
2014/06/20 PHP
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
php取得字符串首字母的方法
2015/03/25 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
python写的ARP攻击代码实例
2014/06/04 Python
python 读写txt文件 json文件的实现方法
2016/10/22 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
python获取栅格点和面值的实现
2020/03/10 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
用Python制作音乐海报
2021/01/26 Python
HTML5离线缓存Manifest是什么
2016/03/09 HTML / CSS
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
五十岁生日宴会答谢词
2014/01/15 职场文书
优秀实习生感言
2014/03/01 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
八一建军节演讲稿
2014/09/10 职场文书
交通违章检讨书
2014/09/21 职场文书
小班下学期个人总结
2015/02/12 职场文书
详细谈谈MYSQL中的COLLATE是什么
2021/06/11 MySQL
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏