Ваша проблема действительно была, как сказал Адриан Данишевский, однако у вашего кода есть еще несколько проблем с программированием.
Прежде всего, вы должны ознакомиться с 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())