Как удалить изображение если его сторона меньше заданной
Есть папка с кучей картинок в формате jpg (более 10000 штук). Часть из них очень маленькие. Хочу написать программу, которая будет удалять картинки маленького формата, по заданным параметрам. Пока вариант такой, но он выдает ошибку дойдя до os.remove(path). В чем причина и как это исправить? Или подскажите другой вариант решения.
from PIL import Image
import os
directory = r'C:\Python works\Foto\ff'
files = os.listdir(directory)
s = 0
for i in files:
if i.endswith('.jpg'):
path = r'C:\Python works\Foto\ff\{}'.format(files[s])
im = Image.open(path)
width, height = im.size
if width <= 100 or height <= 100:
print("Найдено изображение {}".format(i))
try:
os.remove(path)
except:
print('Error')
print('Удалено')
s += 1
Ответы (2 шт):
Автор решения: n1tr0xs
→ Ссылка
Вы забыли закрыть изображение перед удалением
from PIL import Image
import os
directory = 'C:\\Python works\\Foto\\ff'
files = os.listdir(directory)
for i in files:
if i.endswith('.jpg'):
path = f'{directory}\\{i}'
im = Image.open(path)
width, height = im.size
im.close()
if width <= 100 or height <= 100:
print(f'Найдено изображение {i}')
try:
print(path)
os.remove(path)
except:
print(f'Error: {e}')
print('Удалено')
Автор решения: MaxU
→ Ссылка
@n1tr0xs уже объяснил причину появления ошибки и как с ней бороться - я бы хотел предложить чуть более короткий и читаемый вариант:
from pathlib import Path
def is_img_too_small(path, width=1000, height=1000):
with Image.open(path) as im:
size = im.size
return size[0] < width or size[1] < height
удаляем все "*.jpg" файлы в директории, у которых хотя бы одна из сторон меньше 100:
p = Path(r"C:\Python works\Foto\ff")
_ = [f.unlink() for f in p.glob("*.jpg")
if is_img_too_small(f, width=100, height=100)]