[Python系列] 监听文件夹和文件

这篇具有很好参考价值的文章主要介绍了[Python系列] 监听文件夹和文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

起因

        经常在写程序的时候,要监听某个文件夹是否生成了新的文件,或者某个文件是否被修改了。也有时候是实时监控某个地方看看是不是被垃圾文件或病毒文件占据或者生成了log信息及时需要处理的。总而言之有很多种情况下,都需要对文件夹及文件进行监控并且及时作出相应的处理。这时候,一个简单的python脚本就能很好地解决问题了。

过程

        简单地查了一下相应的库,有两个推荐的库可以很轻松地做到这个事,PyInotify和WatchDog,还是简单地看一下。      

PyInotify

什么是PyInotify        

        PyInotify 是一个 Python 库,用于监视文件系统事件,例如文件的创建、删除、移动、重命名等。它基于 inotify 库,提供了一个 Python API,方便开发者使用。

        PyInotify 支持 cross-platform,可以在 Linux、macOS 和 Windows 等操作系统上使用。它提供了多种方式来监视文件系统事件,例如通过回调函数、生成事件队列、异步监视等。

        使用 PyInotify,可以方便地实现文件系统监视功能,例如监控某个目录下的文件变化、监控进程的输出等。它还可以与 Python 的其他库集成,例如 Django、Flask 等 Web 框架,实现 Web 应用的文件系统监视功能。

        总结起来,PyInotify 是一个功能强大、易于使用的 Python 库,用于监视文件系统事件。它提供了多种监视方式,支持 cross-platform,是开发文件系统监视应用的理想选择。

安装和使用

        我们还是通过pip安装:

pip install pyinotify

这时候,我们就可以直接在脚本中import进来使用了

import pyinotify
# 初始化 Inotify 实例  
inotify_instance = pyinotify.Init()
# 设置监视目录    sys.argv[1]为需要监视的目录
inotify_instance.add_watch(sys.argv[1], pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_MOVED_FROM | pyinotify.IN_MOVED_TO)
# 循环等待事件  
while True:  
   event = inotify_instance.wait()
   # 处理事件  
   if event.is_deleted():  
       print(f"文件 {event.pathname()} 被删除")  
   elif event.is_created():  
       print(f"文件 {event.pathname()} 被创建")  
   elif event.is_moved_from():  
       print(f"文件 {event.pathname()} 从 {event.old_pathname()} 移动到当前位置")  
   elif event.is_moved_to():  
       print(f"文件 {event.pathname()} 从 {event.old_pathname()} 移动到 {event.pathname()}")
# 退出 Inotify 实例  
inotify_instance.close()  

        在这个示例程序中,我们首先通过 pyinotify.Init() 初始化 Inotify 实例。然后,我们使用 inotify_instance.add_watch() 设置监视目录,并指定监视的事件类型,包括文件的创建、删除、移动等。

        接下来,我们使用 inotify_instance.wait() 循环等待事件。每当有事件发生时,我们会通过 event.is_deleted()、event.is_created()、event.is_moved_from() 和 event.is_moved_to() 方法判断事件类型,并输出相应的信息。

        最后,在程序结束时,我们使用 inotify_instance.close() 退出 Inotify 实例。

        这个示例可以通过在命令行中运行 python pyinotify_example.py 来启动。例如,如果在命令行中运行 python pyinotify_example.py /home/user/docs,则程序将监视 /home/user/docs 目录下的文件变化,并在控制台输出相应的信息。

 PyInotify的原理

        PyInotify 的原理是通过 inotify 库与 Linux 内核中的 inotify 系统调用接口,来实现对文件系统事件的监视。

        inotify 是 Linux 内核中的一个系统调用,用于监视文件系统事件。它可以监视指定目录下的文件事件,包括文件的创建、删除、移动、重命名等。inotify 提供了一个事件队列,可以存放正在等待处理的事件。当有新事件到达时,inotify 会将事件放入事件队列中,并通知进程。进程可以从事件队列中读取事件,并根据事件类型进行相应的处理。

PyInotify 通过封装 inotify 系统调用,提供了一个 Python API,方便开发者使用。它主要包括以下几个步骤:

        初始化 Inotify 实例:使用 pyinotify.Init() 函数初始化 Inotify 实例,并返回一个 Inotify 实例对象。

        添加监视目录:使用 inotify_instance.add_watch() 函数将目录添加到 Inotify 实例的监视列表中。

        等待事件:使用 inotify_instance.wait() 函数等待 Inotify 实例中的事件。

        处理事件:当有新事件到达时,使用 event.is_deleted()、event.is_created()、event.is_moved_from() 和 event.is_moved_to() 方法判断事件类型,并进行相应的处理。

        退出 Inotify 实例:使用 inotify_instance.close() 函数退出 Inotify 实例。

通过这些步骤,PyInotify 可以实现对文件系统事件的监视,并在事件发生时触发相应的处理函数。这使得开发者可以方便地实现文件系统监视功能,例如监控某个目录下的文件变化、监控进程的输出等。

WatchDog

什么是watchdog

        watchdog 库是一个用于监视文件系统事件的第三方库。它提供了一个 Python API,方便开发者使用。watchdog 库支持跨平台,可以在 Linux、macOS 和 Windows 等操作系统上使用。它提供了多种方式来监视文件系统事件,例如通过回调函数、生成事件队列、异步监视等。使用 watchdog 库,可以方便地实现文件系统监视功能,例如监控某个目录下的文件变化、监控进程的输出等。watchdog 库还支持与 Python 的其他库集成,例如 Django、Flask 等 Web 框架,实现 Web 应用的文件系统监视功能。

安装和使用

我们直接通过Pip库安装吧:

pip install watchdog

然后写个python程序试验一下:

import time  
from watchdog.observers import Observer  
from watchdog.events import FileSystemEventHandler
class MyHandler(FileSystemEventHandler):  
   def on_modified(self, event):  
       print(f"文件 {event.src_path} 被修改")
if __name__ == "__main__":  
   event_handler = MyHandler()  
   observer = Observer()  
   observer.schedule(event_handler, path='listen directory', recursive=False)  
   observer.start()  
   try:  
       while True:  
           time.sleep(1)  
   except KeyboardInterrupt:  
       observer.stop()  
   observer.join()

        在这个示例中,我们监听的文件夹是程序中'listen directory'这个位置,把这个字符串修改成需要监听的文件夹就行了。实现方式是这样的,我们首先创建一个名为 MyHandler 的类,它继承自 FileSystemEventHandler。然后,我们重写 on_modified 方法,用于处理文件修改事件。当文件被修改时,我们会输出文件的路径。

        接下来,我们创建一个 Observer 实例,并使用 schedule 方法注册事件处理器。我们指定要监视的目录路径和处理事件的函数,即 MyHandler 类的 on_modified 方法。

        最后,我们启动观察者(observer.start()),并使用一个无限循环来等待事件。在循环中,我们会定期检查是否有新事件。如果有,我们会处理它们。当发生 KeyboardInterrupt 事件时,我们停止观察者(observer.stop()),并等待它完成处理(observer.join())。

        这个示例可以通过在命令行中运行 python watchdog_example.py 来启动。例如,如果在命令行中运行 python watchdog_example.py,则程序将监视当前目录下的文件变化,并在控制台输出相应的信息。

watchdog的原理 

        watchdog 库的原理是通过在文件系统中注册一个监视器来监视文件事件,当有事件发生时,监视器通知 watchdog 库,watchdog 库再将事件传递给注册的观察者。观察者通过实现 FileSystemEventHandler 类的方法来处理文件事件。

PyInotify和WatchDog的区别

        PyInotify 和 watchdog 都是用于监视文件系统事件的 Python 库,但它们有一些关键区别:

        底层实现:PyInotify 基于 inotify 库,而 watchdog 库基于 inotify 和 kqueue(一个用于监视文件系统事件的 Linux 内核 API)。这意味着 PyInotify 仅支持 Linux 系统,而 watchdog 可以运行在 Linux、macOS 和 Windows 等多个操作系统上。

        事件处理方式:PyInotify 使用事件队列的方式处理文件系统事件,而 watchdog 使用回调函数的方式。这意味着 PyInotify 需要手动从事件队列中读取事件并进行处理,而 watchdog 可以在事件发生时直接调用注册的处理器函数。

        支持的功能:PyInotify 支持的功能较为简单,主要用于监视目录下的文件事件,包括文件的创建、删除、移动、重命名等。而 watchdog 库支持的功能更为丰富,可以监视文件的读写操作、属性改变、链接改变等。此外,watchdog 还支持监视子进程的输出、日志记录等功能。

        使用场景:PyInotify 更适合用于简单的文件系统监视任务,例如监控某个目录下的文件变化。而 watchdog 库的功能更为丰富,适用于更复杂的场景,例如监控进程的输出、监控网络连接等。

        总的来说,PyInotify 和 watchdog 都是用于监视文件系统事件的 Python 库,但它们的底层实现、事件处理方式、支持的功能和使用场景等方面存在一些关键区别。开发者可以根据自己的需求选择合适的库来实现文件系统监视功能。文章来源地址https://www.toymoban.com/news/detail-776121.html

到了这里,关于[Python系列] 监听文件夹和文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python判断文件或文件夹是否存在、创建文件夹

    以下的内容参考http://t.csdn.cn/aybFd,https://www.cnblogs.com/hushaojun/p/4533241.html python判断文件或文件夹是否存在、创建文件夹 1、判断文件或文件夹是否存在 2、判断所给路径是文件还是文件夹 3、创建文件夹 4、获取当前.py文件的路径 5、获取指定目录下所有的文件和文件夹 删除一个

    2024年02月10日
    浏览(75)
  • Python-拷贝文件和文件夹到指定的文件夹

    之前使用windows批处理命令,感觉语法太不友好,还需要传很多参数,用起来很麻烦,最后还是用Python来实现。 网上太多的教程,真的不知所云,有点太麻烦了,拷贝之前先删除,也懒得判断。 shutil.copyfile 顾名思义 拷贝的是文件 shutil.copytree 顾名思义 拷贝的是文件夹 这样使

    2024年02月11日
    浏览(91)
  • python读取文件夹下的文件以及子文件夹中文件

    os.listdir() 读取目标文件夹下的文件名和子文件夹名,不会递归读取子文件夹下 方法一: root, dirs, files = os.walk() 递归读取文件夹和 子文件夹下所有文件 。方法二:也可以用os.listdir(),判断是文件夹再os.listdir()自己写一个递归程序 示例

    2024年02月16日
    浏览(70)
  • Python 文件和文件夹操作

    模式 操作 若文件不存在 是否覆盖 rb 二进制只读 报错 - r+ 可读可写 报错 是 w 只写 创建 是 wb 二进制只写 创建 是 w+ 可读可写 创建 是 a 只写 创建 否,追加写 a+ 可读可写 创建 否,追加写 open(\\\'path\\\', \\\'mode\\\') 打开一个文件如果需要指定路径,为防止路径中的 对 python 干扰, 最

    2024年02月09日
    浏览(52)
  • chatgpt赋能python:Python如何保存文件到文件夹?

    Python是一种高级编程语言,广泛应用于数据科学、网络编程、自动化任务等领域。其中,保存文件到文件夹是Python编程中的重要功能。本文将介绍Python如何保存文件到文件夹的方法,包括如何创建文件夹和如何向文件夹中保存文件。 在Python中,可以使用os模块中的makedirs()函数

    2024年02月08日
    浏览(53)
  • python获取文件夹下所有文件

    python获取文件夹下所有文件,大家肯定都会想到os.listdir了,但是这种方法只能够获取到当前文件夹中的所有文件/文件夹,如果我想获得文件夹-文件夹-文件呢? 我的需求是只要文件夹中所有非文件夹,换句话来说对于我们的需求只有文件夹和非文件夹两种情况,那么直接联

    2024年02月12日
    浏览(52)
  • Python文件夹遍历

    常用到文件夹遍历操作,会对文件进行如下操作: 文件夹数量 文件数量 文件类型及各类型数量 文件属性:大小、创建日期、最后修改日期 0. 基本分析 使用 os lib 使用 glob 使用 CSDN 创作助手 和 百度 文心一言分别提问 1. 使用 CSDN 创作助手     - 提问  python 遍历文件夹

    2024年02月10日
    浏览(48)
  • python跨文件夹调用别的文件夹下的py文件或参数方式

    目录 摘要: 第一章   运行另一个py文件 (1)在file_A.py中运行file_B.py文件,注意这里是运行,不是引用 (2)file_B.py使用file_A.py传递的参数 (3) 引用另一个py文件中的变量或者方法 第二章 python调用自己写的py文件 (1)同一个目录下的文件 (2)不同目录下的文件 (3)多

    2024年02月08日
    浏览(109)
  • python 读取文件夹下子文件夹下的csv数据表

    可以使用 Python 中的  os  和  csv  模块来读取文件夹下的文件夹的 csv 数据。具体的步骤如下: 导入  os  和  csv  模块。 使用  os  模块的  listdir  函数列举出目标文件夹下的所有子文件夹的名称。 对于每个子文件夹,列举出其中的所有 .csv 文件的名称,并逐一读取 csv

    2024年02月11日
    浏览(79)
  • Python——自动创建文件夹

    利用 Python编程语言实现自动创建文件夹,程序以函数形式封装,直接按要求传参即可调用。 在python中没有直接针对文件夹的操作方法,可以借助模块os,os.path和shutil来操作。 在新建文件夹时可以创建一级文件,也可以创建多级文件。 判断文件或者文件夹是否存在,可以使用

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包