权限错误:[WinError 32] 进程无法访问文件,因为它正在被另一个进程使用。

47

我的代码是用于查看一个文件夹并删除分辨率低于1920x1080的图像。我遇到的问题是,当我的代码运行时;

import os
from PIL import Image

while True:    
    img_dir = r"C:\Users\Harold\Google Drive\wallpapers"
    for filename in os.listdir(img_dir):
        filepath = os.path.join(img_dir, filename)
        im = Image.open(filepath)
        x, y = im.size
        totalsize = x*y
        if totalsize < 2073600:
            os.remove(filepath)

我收到了这个错误信息:

Traceback (most recent call last):
  File "C:\Users\Harold\Desktop\imagefilter.py", line 12, in <module>
    os.remove(filepath)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\Harold\\Google Drive\\wallpapers\\Car - ABT Audi RS6-R [OS] [1600x1060].jpg'

只是确认一下,Python 是我电脑上唯一运行的程序。这个问题是由什么引起的,我该怎么解决?

7个回答

39

你的进程是通过 im 仍然存在而打开了该文件。在删除文件之前,你需要先将其关闭。

我不知道 PIL 是否支持 with 上下文,但如果支持:

import os
from PIL import Image

while True:    
    img_dir = r"C:\Users\Harold\Google Drive\wallpapers"
    for filename in os.listdir(img_dir):
        filepath = os.path.join(img_dir, filename)
        with Image.open(filepath) as im:
            x, y = im.size
        totalsize = x*y
        if totalsize < 2073600:
            os.remove(filepath)

在执行 os.remove 前,使用这段代码可以确保删除 im (并关闭文件)。

如果没有成功,你可能想要查看 Pillow ,因为 PIL 的开发基本上已经停滞了。


18

我遇到了同样的问题,但这个错误是间歇性的。如果您正确地编写了文件的打开/关闭操作,但仍然遇到此错误,请确保您没有将文件与Dropbox、Google Drive等进行同步。我暂停了Dropbox的同步,现在不再看到这个错误。


9
这基本上是一个权限错误,你只需要在删除文件之前关闭文件即可。获取图像大小信息后,请使用相应的命令关闭图像。
im.close()

3
并非所有情况下都适用。例如,如果我使用代码 file_path = os.path.join(os.path.expanduser("~/Desktop"),'my_file.zip') 构建了一个路径,然后尝试执行 file_path.close(),就会出现 AttributeError: 'str' object has no attribute 'close' 的错误。 - Adrian Keister
@AdrianKeister,这是因为你将file_path分配给了一个“str”对象,而不是一个“file”对象。对于经验丰富的Python程序员来说,这是一个明显的错误。这个答案是关闭文件的完全可接受的方式。然而,与接受的答案中提到的使用“with”上下文相比,它不太符合习惯用法。 - Bobort

2

我也遇到了这个问题,在Windows中出现了[WinError 32]

通过更改以下内容解决:

try:
    f = urllib.request.urlopen(url)
    _, fname = tempfile.mkstemp()
    with open(fname, 'wb') as ff:
        ff.write(f.read())
    img = imread(fname)
    os.remove(fname)
    return img

转换为:

try:
    f = urllib.request.urlopen(url)
    fd, fname = tempfile.mkstemp()
    with open(fname, 'wb') as ff:
        ff.write(f.read())
    img = imread(fname)
    os.close(fd)
    os.remove(fname)
    return img

在这里找到:https://no.coredump.biz/questions/45042466/permissionerror-winerror-32-when-trying-to-delete-a-temporary-image


0

希望这能有所帮助。

import os

def close():

    try:
        os.system('TASKKILL /F /IM excel.exe')

    except Exception:
        print("KU")

close()

0
我在这个问题上遇到了一个不同的问题和“傻啦!”的时刻。
在MacOS上,myfile.close是可以接受的,但是当我转到Windows时,出现了这里引用的错误。
在Windows上简单地添加()就解决了问题,而且不会对MacOS造成任何影响 - myfile.close()

0
无论出于什么原因,导致这个问题的是IntellIJ占用了文件的句柄。关闭Intellij解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接