如何检测目录随时间新增的文件 避免重复读取已处理旧文件
实现方法
核心逻辑是本地持久化保存已处理过的文件记录,每次运行时跳过已在记录中的文件,仅处理新增文件,首次运行时记录文件为空,会自动处理当前目录下所有符合要求的.ls文件,完全匹配需求。
具体实现要点
- 在脚本同级目录维护一个记录文件
processed_files.txt,逐行存储已经处理过的文件名 - 脚本启动时先读取该记录文件,将所有已处理文件名存入集合(集合的成员判断效率远高于列表),如果记录文件不存在(即首次运行),则初始化空集合
- 遍历目录文件时,除了校验
.ls后缀,额外判断文件是否不在已处理集合中,满足条件才执行处理逻辑 - 每处理完一个新文件,立刻将文件名追加写入记录文件,避免脚本中途异常中断导致下次运行重复处理
- 替换原代码中硬拼接路径的写法,用
os.path.join做路径拼接,兼容Windows、macOS、Linux不同系统的路径分隔符
修改后的可直接运行代码
import os # 配置项 target_dir = path # 替换为你实际存储.ls文件的目录路径 record_file_path = "processed_files.txt" # 已处理文件记录的存储路径 # 加载已处理文件集合 processed_files = set() if os.path.exists(record_file_path): with open(record_file_path, "r", encoding="utf-8") as f: for line in f: file_name = line.strip() if file_name: processed_files.add(file_name) # 遍历目录处理新文件 for file in os.listdir(target_dir): # 跳过非.ls后缀、已经处理过的文件 if not file.endswith(".ls") or file in processed_files: continue # 拼接跨平台兼容的安全文件路径 filepath = os.path.join(target_dir, file) # 调用文件读取处理函数 axisMonitorAverage(filepath) # 处理完成后立刻记录文件名,避免下次重复处理 with open(record_file_path, "a", encoding="utf-8") as f: f.write(f"{file}\n") processed_files.add(file)
可选优化方向
- 如果目录下存在重名文件的可能,可以把记录内容从文件名换成「文件绝对路径+文件修改时间/文件MD5」,避免重名文件被误判为已处理
- 如果需要控制记录文件大小,可以加定期清理逻辑,比如删除超过180天的旧记录,避免记录文件无限增长
- 对文件处理逻辑加异常捕获,处理失败的文件不要写入记录,下次运行可以自动重试
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

