Python瞬时文件删除:高速生成场景下_GOOD_文件批量删除异常排查
文件夹监控与文件删除问题分析
我写了一个循环脚本,用来等特定文件夹生成后,删除里面文件名含“GOOD”的图片(这些图片也是机器生成的)。脚本在本地笔记本模拟环境里运行正常,但在目标机器上,文件删除没法连续执行——只删1-2张就回到循环,可机器还在不停生成新图片。
目标机器生成图片的速度极快,捕获后立刻生成。这会不会是问题根源?是脚本跟不上生成速度,还是代码本身有问题?求解!
原代码
reel_folders_src = \\directory_of_folders_that_are_yet_to_exist\\ def wait_for_reelfolders(folder_paths): last_modified_folder = {folder_path3: None for folder_path3 in folder_paths} while True: print("Waiting for other reel folders") for folder_path3 in folder_paths: if os.path.exists(folder_path3): current_modified = os.path.getmtime(folder_path3) if last_modified_folder[folder_path3] is None or current_modified > last_modified_folder[folder_path3]: last_modified_folder[folder_path3] = current_modified #delete_files_in_folder(folder_path3) for file_name in os.listdir(folder_path3): file_path = os.path.join(folder_path3, file_name) print(f"Ongoing GOOD image purge in folder '{folder_path3}'") if "_GOOD_" in file_path: os.remove(file_path) #These are the folders that are yet to be generated by the machine along with images inside of them reel_folders = [reel_folders_src + '\\' + "Reel2", reel_folders_src + '\\' + "Reel3", reel_folders_src + '\\' + "Reel4"] #Execute function wait_for_reelfolders(reel_folders)
问题根源
- 依赖文件夹修改时间的逻辑有缺陷:系统里文件夹的修改时间(mtime)不一定会随文件生成连续更新——部分系统仅在文件夹本身属性变化(比如新增子文件夹)时才更新mtime,机器快速生成文件时,可能只触发一次mtime变化,后续新文件没法触发删除逻辑。
- 遍历不及时:每次只在mtime变化时遍历一次文件夹,机器生成速度快的话,遍历过程中新增的文件不会被处理,之后也没有再次遍历的触发条件。
- 无错误处理:机器生成图片后可能还在占用文件,直接删除会抛出异常,原代码没做捕获,一旦报错就会终止当前删除流程,后续文件也没法处理。
修复方案
直接修改监控逻辑,改成定期遍历文件夹,同时增加错误处理:
import os import time # 用原始字符串避免路径转义问题 reel_folders_src = r"\\directory_of_folders_that_are_yet_to_exist\\" def wait_for_reelfolders(folder_paths): # 记录已处理过的文件,避免重复操作 processed_files = set() while True: print("监控文件夹中...") for folder_path in folder_paths: if os.path.exists(folder_path): for file_name in os.listdir(folder_path): file_path = os.path.join(folder_path, file_name) # 只处理文件,跳过子文件夹 if os.path.isfile(file_path): if "_GOOD_" in file_name and file_path not in processed_files: try: os.remove(file_path) print(f"已删除: {file_path}") processed_files.add(file_path) except PermissionError: print(f"文件被占用,暂时无法删除: {file_path}") except Exception as e: print(f"删除出错: {file_path}, 原因: {str(e)}") # 根据机器生成速度调整间隔,越快间隔越小,别设为0以免占用过多CPU time.sleep(0.1) # 用os.path.join拼接路径更规范 reel_folders = [ os.path.join(reel_folders_src, "Reel2"), os.path.join(reel_folders_src, "Reel3"), os.path.join(reel_folders_src, "Reel4") ] wait_for_reelfolders(reel_folders)
补充说明
processed_files集合用来避免重复尝试删除已删掉的文件,提升效率。time.sleep(0.1)可以根据实际生成速度微调,比如生成极快的话可以改成0.05秒。- 错误处理确保单个文件删除失败不会影响整个监控流程,后续文件仍能被正常处理。
内容的提问来源于stack exchange,提问作者Jannly
相关产品推荐
相关产品推荐

