hello 大家好我是Monday,代码规范不仅能减少bug,有助于代码审查,降低维护成本,更重要的是在大型项目中,能够提升团队间的合作效率,今天给大家带来篇python代码规范利器-Flake8的文章。
一、简介
看门狗是一款小软件,可以监控文件和目录是否发生变化,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 sysimport timeimport loggingfrom watchdog.observers import Observerfrom watchdog.events import LoggingEventHandlerif __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 sysimport timefrom watchdog.observers import Observerfrom watchdog.events import FileSystemEventHandlerfrom loguru import loggerimport osclass 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) observer.start() try : while True : time.sleep(1 ) except KeyboardInterrupt: observer.stop() observer.join()
参考链接: (1)python watchdog 详细讲解
https://bbs.huaweicloud.com/blogs/325805
结束语 :
今天的分享就到这里了,欢迎大家关注微信公众号”菜鸟童靴 “