Форум сайта python.su
0
Доброго времени суток.
Имеется фото товаров (3 штуки на товар), одно из фото имеет штрихкод, по которому и будет сортироваться по папкам. Задача распознать штрихкод, создать папки, в качестве имени папки использовать штрихкод. Далее в эти папки переместить нужные фото товара (т.е две чистые фотки, фотку со штрихкодом удалить.)
Я не программист, а сисадмин. Прошу помочь реализовать скрипт. На данный момент застрял на том, чтобы сделать так, чтобы кусок кода обрабатывал фото в подкаталогах. Если положить скрипт в корень папки с фото, то он работает.
Для работы нужно установить Zbar
Использую следующий план:
1. Создаю папки по формуле количество файлов разделить на 3. Таким образом в каждой папке будет по 3 файла.
2. Распознать штрихкод в подкаталогах и присвоить имя папке соответствующее штрихкоду
3. Удалить фото со штрихкодом.
Вот какой код имею.
import os import subprocess import glob import locale from math import ceil, floor folder_address = "D:\\Phyton\\IMAGES\\" # адрес папки, где нужно обработать фото directory = os.fsencode(folder_address) i = 0 files_in_folder = 3 # можно менять значение, сколько файлов должно быть в папке. num_of_files = num_of_files = len([name for name in os.listdir(directory) if os.path.isfile(os.path.join(directory, name))]) for x in range(ceil(num_of_files / files_in_folder)): path = folder_address + "\\" + str(x+1) if not os.path.exists(path): os.mkdir(path) files = (file for file in os.listdir(directory) if os.path.isfile(os.path.join(directory, file))) for file in files: file_name = os.fsdecode(file) file_path = os.path.join(folder_address, file_name) new_file_path = os.path.join(folder_address, str(floor(i / files_in_folder) + 1), file_name) os.rename(file_path, new_file_path) i += 1 encoding = locale.getdefaultlocale()[1] # до этого момента код работает, теперь нужно зайти в подкаталоги, распознать штрихкод и переименовать папку # Функция распознавания штрихкода def get_code(file): try: raw_code = subprocess.check_output(["C:\\Program Files (x86)\\ZBar\\bin\\zbarimg", "-q", \ file]) raw_code = raw_code.rstrip() raw_code = raw_code.decode(encoding) code = raw_code.split(':',1)[1] return(code) except: return("unreadable_code") # скорее всего тут нужно использовать рекурсивный обход папок image_files = glob.glob('*.JPG') + glob.glob('*.png') print(image_files) for file in image_files: file_path = os.path.join(os.getcwd(), file) code = get_code(file) # Здесь нужно переименовать существующие папки и присвоить им штрихкод folder = os.path.join(os.getcwd(), code) os.makedirs(folder, exist_ok=True) # Тут должен быть код, который удалит файлы со штрихкодом
Офлайн
124
Выложите отрывок файла с фотографиями
Офлайн
0
До запуска скрипта файлы выглядят так. прикрепляю фото.
Прикреплённый файлы:
до обработки.jpg (34,6 KБ)
Офлайн
0
после обработки на данный момент происходит следующее
Прикреплённый файлы:
после отработки скрипта.jpg (36,4 KБ)
Офлайн
0
а должно быть так, как на следующем фото.
Прикреплённый файлы:
должно быть так.jpg (33,2 KБ)
Офлайн
0
ниже код, который работает, если его отдельно запустить в той же папке ,что и фото. Он распознает штрихкоды с фоток, создает папки с именем штрихкода и переносит в соответствующие папки фотки. В отдельную папку сбрасывает не распознанные
import subprocess import os import locale import glob encoding = locale.getdefaultlocale()[1] def get_code(file): try: raw_code = subprocess.check_output(["C:\\Program Files (x86)\\ZBar\\bin\\zbarimg", "-q", \ file]) raw_code = raw_code.rstrip() raw_code = raw_code.decode(encoding) code = raw_code.split(':',1)[1] return(code) except: return("unreadable_code") image_files=glob.glob('*.JPG') + glob.glob('*.png') print(image_files) for file in image_files: file_path = os.path.join(os.getcwd(), file) code = get_code(file) folder = os.path.join(os.getcwd(), code) os.makedirs(folder, exist_ok=True) os.rename(file_path, folder + "\\" + file)
Офлайн
124
xam1816я имел ввиду папку с фотографиями товаров - 6 или 9 фоток в папке для теста
Выложите отрывок файла с фотографиями
Офлайн
0
Скидываю фото для тестов.
Прикреплённый файлы:
foto test.zip (891,4 KБ)
Офлайн
0
Не учел еще один важный момент. Сейчас у меня просто равномерно фотки падают по 3 шт. в папку. И не всегда это работает правильно. Получается прежде, чем распределить по папкам нужно сначала отсортировать по времени создания, так чтобы фото делились по 3, которые сделанные подряд. Пока ищу способы, как это можно сделать.
Офлайн
124
maxprof90в папке фотки с одним названием, время одно и тоже
Получается прежде, чем распределить по папкам нужно сначала отсортировать по времени создания,
photo_2022-05-25_11-28-47 (2).jpg
photo_2022-05-25_11-28-47 (3).jpg
Отредактировано xam1816 (Май 25, 2022 12:13:52)
Офлайн