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库
其实,还有一些其他的库, 这里小鱼就不做过多的介绍了。