所以我有一些代码,我会通过一堆图像来查看它们是否具有正确的大小,或者是否已损坏。我使用以下代码执行此操作:
import PIL
from PIL import Image
try:
img = Image.open("{}/{}.jpg".format(img_dir_path, n))
except:
os.remove("{}/{}.jpg".format(img_dir_path, n))
continue
if img.size[0] < 600:
img.close()
os.remove("{}/{}.jpg".format(img_dir_path, n))
elif img.size[0] > 600:
img.close()
break
这当然在一个循环内(如n所示)。
所以第一次尝试/除了代码它试图打开一个文件,如果它可以继续前进。如果它不能它通常是腐败的,我要求它删除该文件。到现在为止还挺好。然后我要求它检查图像是否具有正确的尺寸,如果没有,则删除它。但是,这几乎是每次出错的地方,最终我会在标题中发布错误。
WindowsError: [Error 32] The process cannot access the file because it is being used by another process:
它有点随意。有时我会在前10-20张图像中得到它,有时它会发生在图像300或其他东西上。我的想法是图像必须打开,因此无法删除。但是你可以看到我之前使用过img.close()函数,所以这不应该发生。那么有没有解决这个问题?我是否需要延迟时间,以便在尝试删除图像之前实际有时间关闭图像,或者......?
答案 0 :(得分:1)
我猜测它与Windows文件系统有关。添加具有短睡眠的重试循环应解决此问题。
def remove_file(path, retries=3, sleep=0.1):
for i in range(retries):
try:
os.remove(path)
except WindowsError:
time.sleep(sleep)
else:
break
答案 1 :(得分:0)
您可以通过捕获异常,进入调试器,然后使用Processs Explorer来尝试找到打开文件的进程:
try:
...
except WindowsError:
import pdb; pdb.set_trace()
Process Explorer:https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer (Ctrl-F,查找句柄或dll)