You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现文件夹新增文件时自动运行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用户终止程序,退出循环")

关键部分说明

  1. 解决重复检测:

    • 每次循环结束后强制更新before为当前文件列表,确保下次检测仅识别真正的新文件
    • 用绝对路径存储文件,避免文件夹内同名文件导致的误判
  2. 持续运行与终止:

    • 用try-except捕获KeyboardInterrupt(即按Ctrl+C),实现优雅终止
    • 用time.sleep(3)控制检测间隔,匹配你的文件新增频率,避免CPU占用过高
  3. 调用外部脚本:

    • 用subprocess.run调用外部Python脚本,命令格式为["python", 脚本路径, 待处理文件路径]
    • check=True确保脚本运行出错时抛出异常,便于排查问题
    • 若脚本参数格式不同,可自行修改subprocess.run的参数
  4. 文件处理:

    • os.makedirs(..., exist_ok=True)确保输出文件夹存在,无需手动创建
    • shutil.move比os.rename更适合跨磁盘移动文件
    • 仅在确认分析完成且输出文件已移动后,才删除原文件

新手必备知识点

  • 路径拼接:永远用os.path.join拼接路径,避免手动加斜杠导致的跨平台兼容问题
  • 异常处理:用try-except捕获可能的错误(如脚本运行失败、文件不存在),避免程序直接崩溃
  • 集合操作:用集合差集after - before快速筛选新增文件,比列表推导式更高效简洁

内容的提问来源于stack exchange,提问作者Bob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:40:24