PermissionError: [WinError 32] Процесс не может получить доступ к файлу, поскольку он используется другим процессом

Мой код предназначен для скрипта, который просматривает папку и удаляет изображения с разрешением 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 — единственная программа, работающая на моем компьютере. Что вызывает эту проблему и как ее исправить?


person user2885647    schedule 30.11.2014    source источник


Ответы (5)


Ваш процесс - это тот, в котором файл открыт (через 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)

Это позволит удалить im (и закрыть файл) до того, как вы доберетесь до os.remove.

Если это не так, вы можете проверить Pillow, поскольку разработка PIL практически мертва.

person Mike DeSimone    schedule 30.11.2014

Я столкнулся с той же проблемой, но ошибка была прерывистой. Если вы правильно кодируете открытие/закрытие файла и по-прежнему сталкиваетесь с этой ошибкой, убедитесь, что вы не синхронизируете файлы с Dropbox, Google Диском и т. д. Я приостановил работу Dropbox и больше не вижу эту ошибку.

person Cleverlike    schedule 25.09.2017

В основном это ошибка разрешения, вам просто нужно закрыть файл перед его удалением. Получив информацию о размере изображения, закройте изображение с помощью

im.close()
person Ayesha    schedule 01.07.2018
comment
Это работает не во всех случаях. Например, если я создаю путь с кодом file_path = os.path.join(os.path.expanduser("~/Desktop"),'my_file.zip'), а затем пытаюсьfile_path.close(), я получаю AttributeError: объект 'str' не имеет атрибута 'close'. - person Adrian Keister; 31.07.2018
comment
@AdrianKeister, это потому, что вы назначили file_path объекту «str», а не объекту «файл». Это очевидная ошибка для опытного программиста на Python. Этот ответ является вполне приемлемым способом закрыть файл. Однако это не так идиоматично, как использование контекста with, упомянутого в принятом ответе. - person Bobort; 12.09.2018

У меня также была проблема в 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

person fabio.porsche    schedule 22.02.2020

Надеюсь, это поможет.

import os

def close():

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

    except Exception:
        print("KU")

close()
person ADITYA JYOTI    schedule 24.05.2021