Удаление файла Python PermissionError: [WinError 32] - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь удалить дублированное изображение, сравнивая хеш файла md5.

мой код

from PIL import Image
import hashlib
import os
import sys
import io


img_file = urllib.request.urlopen(img_url, timeout=30)
f = open('C:\\Users\\user\\Documents\\ + img_name, 'wb')
f.write(img_file.read())
f.close   # subject image, status = ok

im = Image.open('C:\\Users\\user\\Documents\\ + img_name)
m = hashlib.md5()                # get hash
with io.BytesIO() as memf:
    im.save(memf, 'PNG')
    data = memf.getvalue()
    m.update(data)
    md5hash = m.hexdigest()     # hash done, status = ok
im.close()

if md5hash in hash_list[name]:   # comparing hash
    os.remove('C:\\Users\\user\\Documents\\ + img_name) # delete file, ERROR
else:
    hash_list[name].append(m.hexdigest())

, и я получаю эту ошибку

PermissionError: [WinError 32] The process cannot access the file because it is being used by another process:
'C:\\Users\\user\\Documents\\myimage.jpg'

Iпробовал командную строку администратора, но все равно получаю эту ошибку.Не могли бы вы найти, что обращается к файлу?

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Ваша проблема действительно была, как сказал Адриан Данишевский, однако у вашего кода есть еще несколько проблем с программированием.

Прежде всего, вы должны ознакомиться с with.Вы используете with для BytesIO(), но его также можно использовать для открытия файлов.
Преимущество with open(...) as f: заключается в том, что вам не нужно искать, закрыли ли вы файл или не забыли его закрыть.Он закроет файл в конце отступа.

Во-вторых, в вашем коде есть небольшое дублирование.Ваш код должен быть СУХИМ, чтобы избежать принудительного изменения нескольких местоположений одним и тем же материалом.
Представьте, что вам нужно изменить место сохранения файлов байтов.Прямо сейчас вы будете вынуждены измениться в трех разных местах.
А теперь представьте, что вы не заметили одно из этих мест.

Мое предложение было бы в первую очередь сохранить путь к переменной и использовать это -
bytesimgfile = 'C:\\Users\\user\\Documents\\' + img_name

Пример использования with в вашем коде будет выглядеть так:

with open(bytesimgfile , 'wb') as f:
      f.write(img_file.read())

Полный пример с указанным кодом:

from PIL import Image
import hashlib
import os
import sys
import io


img_file = urllib.request.urlopen(img_url, timeout=30)
bytesimgfile = 'C:\\Users\\user\\Documents\\' + img_name
with open(bytesimgfile , 'wb'):
    f.write(img_file.read())

with Image.open(bytesimgfile) as im:
    m = hashlib.md5()                # get hash
    with io.BytesIO() as memf:
        im.save(memf, 'PNG')
        data = memf.getvalue()
        m.update(data)
        md5hash = m.hexdigest()     # hash done, status = ok

if md5hash in hash_list[name]:   # comparing hash
    os.remove(bytesimgfile) # delete file, ERROR
else:
    hash_list[name].append(m.hexdigest())
1 голос
/ 06 марта 2019

Только что заметил, что вы используете f.close вместо f.close()

Add () и проверьте, если проблема все еще возникает.

Cheers;)

...