基于Python watchdog监控文件夹:检测到两个txt文件时获取最早创建的文件
实现方案
核心逻辑
- 每次文件创建事件触发时,先过滤出
.txt后缀的普通文件事件(排除目录创建事件) - 扫描目标目录下所有
.txt文件,统计数量 - 当数量≥2时,遍历所有txt文件获取创建时间,筛选出创建时间最早的文件
- 输出文件名后可直接插入自定义处理逻辑
可直接运行的修改后代码
#!/usr/bin/env python3 import os import time import glob from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler # 监控路径可以根据需求修改 MONITOR_PATH = r"/root/test/" class EventHandler(FileSystemEventHandler): def on_created(self, event): # 只处理普通文件、后缀为.txt的事件 if event.is_directory or not event.src_path.endswith('.txt'): return # 扫描目标目录下所有txt文件 txt_files = glob.glob(os.path.join(MONITOR_PATH, "*.txt")) # 数量不足2个直接跳过 if len(txt_files) < 2: return # 遍历获取所有txt文件的创建时间 file_ctime_list = [] for file_path in txt_files: # Windows下os.path.getctime为创建时间,Linux下为元数据变更时间 # 若Linux需获取真实创建时间,可根据文件系统替换为statx等接口,常规场景getctime可满足需求 ctime = os.path.getctime(file_path) file_ctime_list.append((ctime, os.path.basename(file_path))) # 按创建时间升序排序,第一个就是最旧的文件 file_ctime_list.sort() oldest_file_name = file_ctime_list[0][1] print(f"检测到至少2个txt文件,最早创建的文件为:{oldest_file_name}") # 此处可扩展自定义处理逻辑,比如移动、删除旧文件等 # self.custom_process(oldest_file_name) if __name__ == "__main__": event_handler = EventHandler() observer = Observer() observer.schedule(event_handler, MONITOR_PATH, recursive=True) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join()
补充说明
- 若需监控子目录下的txt文件,可将
glob的匹配规则修改为os.path.join(MONITOR_PATH, "**/*.txt"),并添加recursive=True参数 - 若对Linux下创建时间获取精度要求高,可使用
os.stat的st_birthtime属性(仅支持部分文件系统)
内容的提问来源于stack exchange,提问作者Alex Rebell
相关产品推荐
相关产品推荐

