Python3, 多种方法实现文件/目录的监听,只想说一个字:泰裤辣。

举报
Carl_奕然 发表于 2023/07/12 11:55:32 2023/07/12
【摘要】 网友:确实,泰裤辣。

1、引言


小云:鱼哥,帮我看下这段代码。
小鱼:看不懂。
小云:我靠, 你都没看,就说看不懂。
小鱼:看不见。
小云:我擦,你真是睁着眼睛说瞎话。
小鱼:…(不说话,只摇头)
小云:你行,连话都不说了。
小鱼:…(点头)
小云:听说最近新开一家…
小鱼:我知道你说的那家, 一般般。
小云:… 我特喵 还没说新开的啥,你就知道了 。
小鱼:早起的鸟儿有虫吃,
小云:我承认你起得早, 但是,帮我看下这段代码。
小鱼:我看过了,不就是实现 文件的监听嘛
小云:唉我去~~你啥时候看到的。
小鱼:咱俩聊天的时候啊。
小云:那你给指导指导呗。
小鱼:我不知道, 我啥也不知道。
小云:我说,你给我指导一下,这段代码。
小鱼:昂, 这,好吧。

我们先看这段代码,

import os
import time
# 监听的目录路径
path_to_watch = 'D:\project'
# 初始化目录中的文件列表
# before = dict([(f, None) for f in os.listdir(path_to_watch)])
before = [f for f in os.listdir(path_to_watch)]
print(before)

def do_something(added):
    print('Added:', ', '.join(added))

while True:
    time.sleep(1)
    # 获取目录中的文件列表
    after = [f for f in os.listdir(path_to_watch)]
    # 获取新增的文件列表
    added = [f for f in after if f not in before]
    if added:
        # 打印新增的文件名称
        do_something(added)
    # 更新目录中的文件列表
    before = after


乍一看,没有啥,写的还可以,
但是,这建立在文件不多的时候,如果文件特别多,那么,这段代码,会让你的CPU很不爽。

在这里插入图片描述
为了让CPU开心一些,我们就来改造这段代码。

2、代码实战


关于文件/目录的监听, 小鱼今天用3种方式来实现。
涉及到 Windows系统和Linux系统 。

2.1 os模块


代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-07-05
# @Author : Carl_DJ
'''
实现功能:
    使用os的stat函数,实现文件/目录的监听
'''


import os
import time

def file_monitor(path):
    # 获取初始文件状态
    last_stat = os.stat(path)
    
    while True:
        # 获取当前文件状态
        current_stat = os.stat(path)
        
        # 检查文件状态是否发生变化
        if current_stat != last_stat:
            print("File has been modified!")
            
            # 更新文件状态
            last_stat = current_stat
        
        # 休眠一段时间后再次检测
        time.sleep(1)

# 监听文件
file_monitor("path/to/file.txt")


2.2 watchdog库


2.2.1 安装


涉及到第三方库,肯定就需要安装
老规矩,pip 安装

pip install watchdog



然后就是等待着安装。

其它安装方式,直接看这两篇:

  • 《Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!》
  • 《Python3:我低调的只用一行代码,就导入Python所有库!》


2.2.2 示例

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-07-05
# @Author : Carl_DJ
'''
实现功能:
    使用watchdog库,实现文件/目录的监听
'''

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class FileEventHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print("File has been modified!")

def file_monitor(path):
    event_handler = FileEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=False)
    observer.start()
    
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    
    observer.join()

# 监听文件
file_monitor("path/to/file.txt")


2.3 inotify


2.3.1 安装


涉及到第三方库,肯定就需要安装
老规矩,pip 安装

pip install inotify



然后就是等待着安装。

其它安装方式,直接看这两篇:

  • 《Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!》
  • 《Python3:我低调的只用一行代码,就导入Python所有库!》


2.3.2 示例


代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-07-05
# @Author : Carl_DJ
'''
实现功能:
    使用inotify库,实现文件/目录的监听
'''


import pyinotify

class FileEventHandler(pyinotify.ProcessEvent):
    def process_IN_MODIFY(self, event):
        print("File has been modified!")

def file_monitor(path):
    wm = pyinotify.WatchManager()
    mask = pyinotify.IN_MODIFY
    
    handler = FileEventHandler()
    notifier = pyinotify.Notifier(wm, handler)
    
    wm.add_watch(path, mask, rec=False)
    
    notifier.loop()

# 监听文件
file_monitor("path/to/file.txt")



3、总结


看到这里,今天的分享就到这里了。
今天主要针对文件/目录的监听进行了分享,主要就是:

  • os的stat函数
  • watchdog库
  • inotify库


其实,还有一些其他的库, 这里小鱼就不做过多的介绍了。

我是小鱼

  • CSDN 博客专家;
  • 阿里云 专家博主;
  • 51CTO博客专家;
  • 51认证讲师等;
  • 认证金牌面试官;
  • 职场面试及培训规划师;
  • 多个国内主流技术社区的认证专家博主;
  • 多款主流产品(阿里云等)测评一、二等奖获得者;


关注我,带你学习更多更专业更前言的Python技术。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。