0%

python监控文件变化的神器-看门狗

hello 大家好我是Monday,代码规范不仅能减少bug,有助于代码审查,降低维护成本,更重要的是在大型项目中,能够提升团队间的合作效率,今天给大家带来篇python代码规范利器-Flake8的文章。

一、简介

看门狗是一款小软件,可以监控文件和目录是否发生变化,watchdog就是一款可以监控文件系统变化的第三方模块,当被监视的区域发生文件或目录的创建,修改,或者删除时,就可以引发特定的事件,我们只需要编写针对这些事件的函数即可处理这些变化。

二、安装

1
pip install watchdog

三、代码解析、

官方文档 : https://pypi.org/project/watchdog/

我们从官方文档复制 使用代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
path = sys.argv[1] if len(sys.argv) > 1 else '.'
# 生成时间处理器对象
event_handler = LoggingEventHandler()
# 生成监控器对象
observer = Observer()
# 注册事件处理器,配置监控目录
observer.schedule(event_handler, path, recursive=True)
# 监控器启动-=创建线程
observer.start()
# 保持主线程运行
try:
while True:
time.sleep(1)
finally:
observer.stop()
# 等待其他主线程执行结束后,主要线程结束
observer.join()

可以看到代码中有几个关键步骤,

1.配置各项信息;
2.生成事件处理器、监控器;
3.注册事件处理器、配置目录、递归执行(即同时监控子文件夹);
4:启动。

1
schedule(event_handler, path, recursive=False)

该方法用于监视 path 路径,并调用给定的事情 event_handler

最后一个参数 recursive 表示是否递归子目录,即监听子目录,默认为 False

其实,看门狗的observer是基于threading.Thread对象的,所以observer很多属性都继承了 threading.Thread 的属性。

如果你不带参数地运行该脚本,就是要监控脚本文件所在的文件夹,如果要监控其他文件夹,记得运行时带文件夹的路径参数,如:

1
python obserber.py /data/home/ckend/

我们来试着运行看看:

2、监控文件变化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import sys
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from loguru import logger
import os

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

def on_moved(self, event):
print("文件移动触发")
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):
print("文件创建触发")

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):
print("文件删除触发")
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):
print("文件编辑触发")
path = os.path.abspath(event.src_path)
if event.is_directory:
print("directory modified:{0}".format(path))
else:
print(dir(event))
logger.debug("file modified:{0}".format(path))

if __name__ == "__main__":

path = sys.argv[1] if len(sys.argv) > 1 else '.'
# 生成时间处理器对象
event_handler = FileEventHandler()
# 生成监控器对象
observer = Observer()
# 注册事件处理器,配置监控目录
observer.schedule(event_handler, path, recursive=True)
# 监控器启动-=创建线程
observer.start()
# 保持主线程运行
try:
while True:
time.sleep(1)
finally:
observer.stop()
# 等待其他主线程执行结束后,主要线程结束
observer.join()

FileSystemEvent 文件类派生出来的子类包括如下内容

  • watchdog.events.FileCreatedEvent() :文件被创建时触发该事件;
  • watchdog.events.DirCreatedEvent() :目录被创建时触发该事件;
  • watchdog.events.FileDeletedEvent() :文件被删除时触发该事件;
  • watchdog.events.DirDeletedEvent() :目录被删除时触发该事件;
  • watchdog.events.FileModifiedEvent() :文件被修改时触发该事件;
  • watchdog.events.DirModifiedEvent() :目录被修改时触发该事件;
  • watchdog.events.FileMovedEvent() :文件被移动或重命名时触发该事件(event.src_path 表示原路径,还有 event.dest_path );
  • watchdog.events.DirMovedEvent() :目录被移动或重命名时触发该事件(event.src_path 表示原路径,还有 event.dest_path );

watchdog 默认提供的一些事件处理类

  • FileSystemEventHandler:文件,事件处理器的基类,用于处理事件;
  • PatternMatchingEventHandler:模式匹配文件;
  • RegexMatchingEventHandler:正则匹配文件;
  • LoggingEventHandler:记录日志。

多个事件监听:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
event_handler1 = MyHandler()
observer = Observer()
watch = observer.schedule(event_handler1, path='.', recursive=True)

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')

event_handler2 = LoggingEventHandler()
observer.add_handler_for_watch(event_handler2, watch) # 添加event handler
observer.start()

try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()

参考链接:
(1)python watchdog 详细讲解

https://bbs.huaweicloud.com/blogs/325805

结束语

​ 今天的分享就到这里了,欢迎大家关注微信公众号”菜鸟童靴