如何在Python中实现监控文件夹处理Excel后自动删除文件?
Excel文件导入数据库后自动删除的实现方案
可用的文件删除方法
1. os.remove()(最直接常用)
你已经了解这个方法,其实它就是处理单个文件删除的最优选择。在watchdog的on_created事件中,event.src_path就是新创建文件的完整路径,直接传入该方法即可完成删除。
2. pathlib.Path.unlink()(Python 3.4+ 面向对象写法)
用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
相关产品推荐
相关产品推荐

