Python运行触发WinError 32进程无法访问被占用文件问题求助
问题根因
- Pillow的
Image.open默认采用懒加载机制,仅在实际读取像素时才加载文件内容,哪怕使用with上下文管理器,BMP这类格式转换为numpy数组时仍可能残留文件句柄引用,导致后续删除目录时触发占用报错 - Windows文件系统存在缓存锁机制,即便进程主动释放了文件句柄,也可能存在数毫秒的延迟,立刻执行删除操作就会报错
- 现有代码未过滤
os.listdir返回的目录项,若解压目录存在子文件夹,调用Image.open打开目录也会引发异常 - 代码中使用了
np.array但未导入numpy依赖,也会引发运行异常
修复方案
按照以下步骤调整代码即可解决问题:
- 补全numpy依赖导入
- 读取图像时主动调用
img.load()强制将像素数据加载到内存,彻底断开与源文件的关联 - 遍历目录时增加文件校验,仅处理合法的图像文件
- 给
shutil.rmtree增加重试逻辑,适配Windows文件系统的锁延迟 - 异常捕获规则中加入
PermissionError,覆盖文件占用类报错
修复后完整代码
import opendatasets as od import urllib import zipfile import os import shutil from PIL import Image import time import numpy as np try: download = od.download('http://www.mae.cuhk.edu.hk/~cvl/iris_database/iris_database.zip', '../data/') path_extract = '../data/iris_database/' with zipfile.ZipFile('../data/iris_database.zip', 'r') as zip_ref: zip_ref.extractall(path_extract) os.remove(path_extract + 'readme.txt') filenames = os.listdir(path_extract) scans = [] for f in filenames: file_path = os.path.join(path_extract, f) # 跳过目录,仅处理文件 if not os.path.isfile(file_path): continue # 仅处理合法图像格式 if not f.lower().endswith(('.bmp', '.png', '.jpg', '.jpeg')): continue with Image.open(file_path) as img: # 强制加载像素到内存,释放文件句柄 img.load() matrix = np.array(img) scans.append(matrix) print("before RMTREE") # Windows删除目录重试逻辑,兼容文件锁延迟 retry_cnt = 3 while retry_cnt > 0: try: shutil.rmtree(path_extract) break except PermissionError: retry_cnt -= 1 time.sleep(0.5) if retry_cnt == 0: raise RuntimeError("多次尝试删除目录失败,文件仍被占用") print("before OS.REMOVE") os.remove(path_extract[:-1] + '.zip') except (urllib.error.URLError, IOError, RuntimeError, PermissionError) as e: print(e)
内容的提问来源于stack exchange,提问作者user16341274
相关产品推荐
相关产品推荐

