当前位置: 首页 > 科技观察

如何掌握Python监控文件系统的技术

时间:2023-03-15 18:35:29 科技观察

本文转载自微信公众号“Python社”,作者黄伟AI。转载本文请联系Python学会公众号。Watchdogwatchdog通过阅读本文,您将了解如何检测对Python应用程序中现有文件所做的更改。我们将使用一个维护良好的模块,称为看门狗。根据官方文档,watchdog是一个用于监视文件系统事件的PythonAPI库和shell实用程序。它同时支持Python2.7和3.4+。但是,对于旧版本,建议您使用watchdog<0.10.0。在本教程中,我将只介绍PythonAPI库。让我们继续下一节并开始安装必要的模块。设置安装非常简单直接pipinstall。在继续之前,强烈建议设置一个虚拟环境。通过在终端中运行以下命令,可以通过两种方式在PyPI上进行安装。pipinstallwatchdog将安装最新版本的PyPI(撰写本文时为0.10.2)。从存储库安装或者,您可以将存储库克隆到本地文件夹并正常安装。首先,让我们使用以下命令克隆它。gitclone--recursivegit://github.com/gorakhargosh/watchdog.git使用以下命令更改工作目录。确保它在您的工作目录中包含一个名为setup.py的文件。cdwatchdog运行以下命令来安装它。pipinstall-e.直接从存储库克隆它的主要优点之一是您可以获得具有附加功能的最新版本。您可以通过在终端中运行以下命令来验证安装是否成功。pipshowwatchdog让我们继续下一节并开始编写Python代码。实现watchdog的主要构建块基于以下类:Observers事件处理程序因此实现非常简单:创建watchdog.observers的实例。观察者线程类。使用您自己的实现定义事件处理程序的子类,并从中创建实例。调度函数由带有附加事件处理程序的观察者实例调用。它接受一些其他输入参数,例如要观看的目录的路径。启动观察者线程并等待它生成将触发事件处理程序中的代码的事件。事件处理程序当前模块中有4种类型的事件处理程序可用:FileSystemEventHandler——基本的文件系统事件处理程序,其方法可以被覆盖。PatternMatchingEventHandler-将给定模式与与正在发生的事件关联的文件路径相匹配。RegexMatchingEventHandler-匹配给定的正则表达式和与事件发生相关联的文件路径。LoggingEventHandler-记录捕获的所有事件。其余的类继承自FileSystemEventHandler,它提供了以下功能供我们重写。on_any_event-捕获所有事件处理程序。on_created-在创建文件或目录时调用。on_deleted-删除文件或目录时调用。on_modified-当文件或目录被修改时调用。on_moved-当文件或目录被移动或重命名时调用。import创建一个新的Python文件并添加以下import语句。我将其命名为test.py。子类fromwatchdog.observersimportObserverfromwatchdog.eventsimportFileSystemEventHandlerFileSystemEventHandler创建一个新类,它继承自FileSystemEventHandler并根据用例相应地覆盖函数。我打算将其命名为MyHandler,但您可以随意命名。classMyHandler(FileSystemEventHandler):defon_any_event(self,event):print(event.event_type,event.src_path)defon_created(self,event):print("on_created",event.src_path)defon_deleted(self,event):print("on_deleted",event.src_path)defon_modified(self,event):print("on_modified",event.src_path)defon_moved(self,event):print("on_moved",event.src_path)用实现的逻辑替换打印语句。对于每个函数,它都有一个名为event的输入参数,其中包含以下变量:event_type-作为字符串的事件类型。默认为无。is_directory-如果事件是针对目录触发的,则为真;否则为假。src_path-触发此事件的文件系统对象的源路径。最有用的参数是src_path,您可以在其中使用它来确定在运行适当的逻辑之前修改了哪个文件。if(event.src_path=="./path/file.txt"):print("Executeyourlogichhere!")Observers和Events一旦你创建了一个子类,你就可以安全地创建它的实例和Observer类了。将您选择的路径分配给监视过程。我将检查一个新创建的名为json的文件夹。您可以根据自己的喜好对其进行修改。也可以设置recursive参数,但是强烈建议预定义hierarchy设置为false,防止出现权限不足或者无法访问子文件夹的问题。调用start会运行线程,当你在相应的路径中进行修改时,会产生一个事件。event_handler=MyHandler()observer=Observer()observer.schedule(event_handler,path='./json/',recursive=False)observer.start()test要测试这个,你必须实现一个运行循环以防止它退出。退出KeyboardInterrupt异常时,调用stop函数清理资源。whileTrue:try:passexceptKeyboardInterrupt:observer.stop()保存Python文件并在终端中运行它。根据您设置的名称修改名称。pythontest.py您可以通过创建一个新文档、修改其内容并将其从目录中删除来轻松地对其进行测试。以下是输出示例: