Python文件监听工具pyinotify与watchdog实例


Posted in Python onOctober 15, 2018

pyinotify库

支持的监控事件

@cvar IN_ACCESS: File was accessed.
@type IN_ACCESS: int
@cvar IN_MODIFY: File was modified.
@type IN_MODIFY: int
@cvar IN_ATTRIB: Metadata changed.
@type IN_ATTRIB: int
@cvar IN_CLOSE_WRITE: Writtable file was closed.
@type IN_CLOSE_WRITE: int
@cvar IN_CLOSE_NOWRITE: Unwrittable file closed.
@type IN_CLOSE_NOWRITE: int
@cvar IN_OPEN: File was opened.
@type IN_OPEN: int
@cvar IN_MOVED_FROM: File was moved from X.
@type IN_MOVED_FROM: int
@cvar IN_MOVED_TO: File was moved to Y.
@type IN_MOVED_TO: int
@cvar IN_CREATE: Subfile was created.
@type IN_CREATE: int
@cvar IN_DELETE: Subfile was deleted.
@type IN_DELETE: int
@cvar IN_DELETE_SELF: Self (watched item itself) was deleted.
@type IN_DELETE_SELF: int
@cvar IN_MOVE_SELF: Self (watched item itself) was moved.
@type IN_MOVE_SELF: int
@cvar IN_UNMOUNT: Backing fs was unmounted.
@type IN_UNMOUNT: int
@cvar IN_Q_OVERFLOW: Event queued overflowed.
@type IN_Q_OVERFLOW: int
@cvar IN_IGNORED: File was ignored.
@type IN_IGNORED: int
@cvar IN_ONLYDIR: only watch the path if it is a directory (new
         in kernel 2.6.15).
@type IN_ONLYDIR: int
@cvar IN_DONT_FOLLOW: don't follow a symlink (new in kernel 2.6.15).
           IN_ONLYDIR we can make sure that we don't watch
           the target of symlinks.
@type IN_DONT_FOLLOW: int
@cvar IN_EXCL_UNLINK: Events are not generated for children after they
           have been unlinked from the watched directory.
           (new in kernel 2.6.36).
@type IN_EXCL_UNLINK: int
@cvar IN_MASK_ADD: add to the mask of an already existing watch (new
          in kernel 2.6.14).
@type IN_MASK_ADD: int
@cvar IN_ISDIR: Event occurred against dir.
@type IN_ISDIR: int
@cvar IN_ONESHOT: Only send event once.
@type IN_ONESHOT: int
@cvar ALL_EVENTS: Alias for considering all of the events.
@type ALL_EVENTS: int

python 3.6的demo

import sys
import os
import pyinotify
WATCH_PATH = '/home/lp/ftp' # 监控目录
if not WATCH_PATH:
  print("The WATCH_PATH setting MUST be set.")
  sys.exit()
else:
  if os.path.exists(WATCH_PATH):
    print('Found watch path: path=%s.' % (WATCH_PATH))
  else:
    print('The watch path NOT exists, watching stop now: path=%s.' % (WATCH_PATH))
    sys.exit()
# 事件回调函数
class OnIOHandler(pyinotify.ProcessEvent):
  # 重写文件写入完成函数
  def process_IN_CLOSE_WRITE(self, event):
    # logging.info("create file: %s " % os.path.join(event.path, event.name))
    # 处理成小图片,然后发送给grpc服务器或者发给kafka
    file_path = os.path.join(event.path, event.name)
    print('文件完成写入',file_path)
  # 重写文件删除函数
  def process_IN_DELETE(self, event):
    print("文件删除: %s " % os.path.join(event.path, event.name))
  # 重写文件改变函数
  def process_IN_MODIFY(self, event):
    print("文件改变: %s " % os.path.join(event.path, event.name))
  # 重写文件创建函数
  def process_IN_CREATE(self, event):
    print("文件创建: %s " % os.path.join(event.path, event.name))
def auto_compile(path='.'):
  wm = pyinotify.WatchManager()
  # mask = pyinotify.EventsCodes.ALL_FLAGS.get('IN_CREATE', 0)
  # mask = pyinotify.EventsCodes.FLAG_COLLECTIONS['OP_FLAGS']['IN_CREATE']               # 监控内容,只监听文件被完成写入
  mask = pyinotify.IN_CREATE | pyinotify.IN_CLOSE_WRITE
  notifier = pyinotify.ThreadedNotifier(wm, OnIOHandler())  # 回调函数
  notifier.start()
  wm.add_watch(path, mask, rec=True, auto_add=True)
  print('Start monitoring %s' % path)
  while True:
    try:
      notifier.process_events()
      if notifier.check_events():
        notifier.read_events()
    except KeyboardInterrupt:
      notifier.stop()
      break
if __name__ == "__main__":
  auto_compile(WATCH_PATH)
  print('monitor close')

watchdog库

支持的监控事件

EVENT_TYPE_MODIFIED: self.on_modified,
EVENT_TYPE_MOVED: self.on_moved,
EVENT_TYPE_CREATED: self.on_created,
EVENT_TYPE_DELETED: self.on_deleted,

需要注意的是,文件改变,也会触发文件夹的改变

python3.6的demo

#! /usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import asyncio
import base64
import logging
import os
import shutil
import sys
from datetime import datetime
from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer
WATCH_PATH = '/home/lp/ftp' # 监控目录
class FileMonitorHandler(FileSystemEventHandler):
 def __init__(self, **kwargs):
  super(FileMonitorHandler, self).__init__(**kwargs)
  # 监控目录 目录下面以device_id为目录存放各自的图片
  self._watch_path = WATCH_PATH
 # 重写文件改变函数,文件改变都会触发文件夹变化
 def on_modified(self, event):
  if not event.is_directory: # 文件改变都会触发文件夹变化
   file_path = event.src_path
   print("文件改变: %s " % file_path)
if __name__ == "__main__":
 event_handler = FileMonitorHandler()
 observer = Observer()
 observer.schedule(event_handler, path=WATCH_PATH, recursive=True) # recursive递归的
 observer.start()
 observer.join()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
使用Node.js和Socket.IO扩展Django的实时处理功能
Apr 20 Python
Python抓取百度查询结果的方法
Jul 08 Python
Python的Django框架中自定义模版标签的示例
Jul 20 Python
用Python抢过年的火车票附源码
Dec 07 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
Python排序搜索基本算法之希尔排序实例分析
Dec 09 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
Apr 02 Python
在django view中给form传入参数的例子
Jul 19 Python
python+gdal+遥感图像拼接(mosaic)的实例
Mar 10 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
VSCODE配置Markdown及Markdown基础语法详解
Jan 19 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 Python
Python并行分布式框架Celery详解
Oct 15 #Python
对Python 内建函数和保留字详解
Oct 15 #Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 #Python
便捷提取python导入包的属性方法
Oct 15 #Python
Django安装配置mysql的方法步骤
Oct 15 #Python
深入理解Django自定义信号(signals)
Oct 15 #Python
使用numba对Python运算加速的方法
Oct 15 #Python
You might like
Dojo 学习要点
2010/09/03 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
jquery实现表单输入时提示文字滑动向上效果
2015/08/10 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
Python单例模式实例详解
2017/03/01 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
python 修改本地网络配置的方法
2019/08/14 Python
Python实现某论坛自动签到功能
2019/08/20 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
django 多数据库及分库实现方式
2020/04/01 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
python pymysql库的常用操作
2020/10/16 Python
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
西班牙香水和化妆品连锁店:Druni
2019/05/05 全球购物
师范应届生语文教师求职信
2013/10/29 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
党员干部公开承诺书范文
2015/04/27 职场文书
贷款收入证明范本
2015/06/12 职场文书
运动会800米赞词
2015/07/22 职场文书
母亲节感言
2015/08/03 职场文书
教师节祝酒词
2015/08/11 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
Python办公自动化解决world文件批量转换
2021/09/15 Python
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers