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

如何在Python中实现监控文件夹处理Excel后自动删除文件?

Excel文件导入数据库后自动删除的实现方案

可用的文件删除方法

1. os.remove()(最直接常用)

你已经了解这个方法,其实它就是处理单个文件删除的最优选择。在watchdog的on_created事件中,event.src_path就是新创建文件的完整路径,直接传入该方法即可完成删除。

用pathlib模块的面向对象方式操作路径,代码更简洁易读:

from pathlib import Path
file_path = Path(event.src_path)
file_path.unlink()

注意:别用shutil.rmtree()

这个方法是用来删除整个目录及所有内容的,不适合单个文件删除场景。

修正后的完整脚本

你的原脚本存在几个关键问题:未打开Excel文件、sheet变量未定义、数据库连接语句括号未闭合,同时缺少异常处理逻辑。以下是补全并优化后的版本:

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import ibm_db
import ibm_db_dbi
import os
from pathlib import Path
import xlrd

class ExampleHandler(FileSystemEventHandler):
    def on_created(self, event):
        # 跳过目录,只处理文件
        if event.is_directory:
            return
        
        file_path = event.src_path
        # 仅处理xlrd支持的.xls格式Excel文件
        if not file_path.endswith('.xls'):
            return
        
        try:
            # 打开Excel文件并获取第一个工作表
            workbook = xlrd.open_workbook(file_path)
            sheet = workbook.sheet_by_index(0)
            
            # 建立数据库连接
            connection = ibm_db.connect("DATABASE=xyz; HOSTNAME=xyz; PORT=xyz; PROTOCOL=xyz; UID=xyz; PWD=xyz;", "", "")
            conn = ibm_db_dbi.Connection(connection)
            cur = conn.cursor()

            insert_query = "INSERT INTO EXCELUPLOAD (qty, amt, num, code, name) VALUES (?,?,?,?,?)"

            # 从第二行开始读取数据(跳过表头行)
            for row_idx in range(1, sheet.nrows):
                qty = sheet.cell(row_idx, 0).value
                amt = sheet.cell(row_idx, 1).value
                num = sheet.cell(row_idx, 2).value
                code = sheet.cell(row_idx, 3).value
                name = sheet.cell(row_idx, 4).value

                cur.execute(insert_query, (qty, amt, num, code, name))

            # 提交事务并关闭数据库连接
            cur.close()
            conn.commit()
            conn.close()
            
            # 导入完成后删除文件,两种方法二选一
            # 方法1:os.remove()
            os.remove(file_path)
            # 方法2:pathlib写法
            # Path(file_path).unlink()
            print(f"已完成数据导入并删除文件:{file_path}")
            
        except Exception as e:
            print(f"处理文件{file_path}失败:{str(e)}")
            # 出错时回滚数据库事务
            if 'conn' in locals():
                conn.rollback()
                conn.close()

# 启动监控
observer = Observer()
event_handler = ExampleHandler()
observer.schedule(event_handler, path=r'D:\New folder')
observer.start()

try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()
    observer.join()

关键注意事项

  • 过滤临时文件:Excel保存时会生成~$开头的临时文件,建议在判断文件格式时额外过滤这类文件,避免误处理。
  • 文件占用问题:确保文件完全写入后再处理(watchdog的on_created事件可能在文件未完全保存时触发,可添加短暂延时或文件锁定检测)。
  • 异常处理:必须添加异常捕获,避免单个文件处理失败导致整个监控脚本崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:05:19