如何实现文件夹新增文件时自动运行Python脚本并完成后续处理?
解决文件夹持续检测+脚本调用+文件处理的完整方案
你的代码核心问题很明确:
- 仅在未检测到新文件时才更新
before字典,导致检测到新文件后,下次循环仍会把该文件判定为新增 - 用
break直接终止了循环,无法实现持续运行
下面是修正后的完整代码,完全满足你的需求:
import os import time import subprocess import shutil # 配置参数,根据你的实际路径修改 WATCH_FOLDER = "C:/Users/Projects/main/example" ANALYSIS_SCRIPT = "D:/path/to/your/analysis.py" # 分析脚本的绝对路径 OUTPUT_DEST = "C:/Users/Projects/main/analysis_output" # 输出txt的目标文件夹 CHECK_INTERVAL = 3 # 检测间隔,和你的文件新增频率匹配 # 确保目标输出文件夹存在,不存在则自动创建 os.makedirs(OUTPUT_DEST, exist_ok=True) # 初始化文件列表,用绝对路径避免同名文件误判 before = set(os.path.join(WATCH_FOLDER, f) for f in os.listdir(WATCH_FOLDER)) try: while True: time.sleep(CHECK_INTERVAL) # 按设定间隔等待后再检测 # 获取当前文件夹所有文件的绝对路径 after = set(os.path.join(WATCH_FOLDER, f) for f in os.listdir(WATCH_FOLDER)) # 计算新增文件:当前有但初始列表没有的文件 added_files = after - before for file_path in added_files: print(f"检测到新文件: {file_path}") # 1. 调用外部分析脚本,假设脚本接受文件路径作为参数 try: subprocess.run( ["python", ANALYSIS_SCRIPT, file_path], check=True, # 脚本运行出错时抛出异常 capture_output=True, # 捕获脚本输出(可选) text=True ) print(f"分析脚本已处理文件: {file_path}") except subprocess.CalledProcessError as e: print(f"分析脚本运行失败: {e.stderr}") continue # 跳过当前文件,继续处理下一个 # 2. 定位分析输出的txt文件(这里假设输出文件和原文件同名、后缀为txt) # 如果脚本输出路径固定,直接写死路径即可 output_txt = os.path.splitext(file_path)[0] + ".txt" if os.path.exists(output_txt): # 移动输出文件到目标文件夹 dest_path = os.path.join(OUTPUT_DEST, os.path.basename(output_txt)) shutil.move(output_txt, dest_path) print(f"已移动输出文件到: {dest_path}") # 3. 删除原文件 os.remove(file_path) print(f"已删除原文件: {file_path}") else: print(f"未找到分析输出的txt文件: {output_txt}") # 无论是否有新增文件,都更新初始文件列表 before = after except KeyboardInterrupt: print("\n用户终止程序,退出循环")
关键部分说明
解决重复检测:
- 每次循环结束后强制更新
before为当前文件列表,确保下次检测仅识别真正的新文件 - 用绝对路径存储文件,避免文件夹内同名文件导致的误判
- 每次循环结束后强制更新
持续运行与终止:
- 用
try-except捕获KeyboardInterrupt(即按Ctrl+C),实现优雅终止 - 用
time.sleep(3)控制检测间隔,匹配你的文件新增频率,避免CPU占用过高
- 用
调用外部脚本:
- 用
subprocess.run调用外部Python脚本,命令格式为["python", 脚本路径, 待处理文件路径] check=True确保脚本运行出错时抛出异常,便于排查问题- 若脚本参数格式不同,可自行修改
subprocess.run的参数
- 用
文件处理:
os.makedirs(..., exist_ok=True)确保输出文件夹存在,无需手动创建shutil.move比os.rename更适合跨磁盘移动文件- 仅在确认分析完成且输出文件已移动后,才删除原文件
新手必备知识点
- 路径拼接:永远用
os.path.join拼接路径,避免手动加斜杠导致的跨平台兼容问题 - 异常处理:用
try-except捕获可能的错误(如脚本运行失败、文件不存在),避免程序直接崩溃 - 集合操作:用集合差集
after - before快速筛选新增文件,比列表推导式更高效简洁
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

