Уведомления

Группа в Telegram: @pythonsu

#1 Май 25, 2022 09:18:28

maxprof90
Зарегистрирован: 2022-05-25
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт, который сортирует фото по штрихкоду используя zbar

Доброго времени суток.

Имеется фото товаров (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)
 
 
 
 # Тут должен быть код, который удалит файлы со штрихкодом

Офлайн

#2 Май 25, 2022 09:44:42

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1393
Репутация: +  124  -
Профиль   Отправить e-mail  

Скрипт, который сортирует фото по штрихкоду используя zbar

Выложите отрывок файла с фотографиями

Офлайн

#3 Май 25, 2022 10:36:27

maxprof90
Зарегистрирован: 2022-05-25
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт, который сортирует фото по штрихкоду используя zbar

До запуска скрипта файлы выглядят так. прикрепляю фото.

Прикреплённый файлы:
attachment до обработки.jpg (34,6 KБ)

Офлайн

#4 Май 25, 2022 10:37:13

maxprof90
Зарегистрирован: 2022-05-25
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт, который сортирует фото по штрихкоду используя zbar

после обработки на данный момент происходит следующее

Прикреплённый файлы:
attachment после отработки скрипта.jpg (36,4 KБ)

Офлайн

#5 Май 25, 2022 10:38:03

maxprof90
Зарегистрирован: 2022-05-25
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт, который сортирует фото по штрихкоду используя zbar

а должно быть так, как на следующем фото.

Прикреплённый файлы:
attachment должно быть так.jpg (33,2 KБ)

Офлайн

#6 Май 25, 2022 10:43:16

maxprof90
Зарегистрирован: 2022-05-25
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт, который сортирует фото по штрихкоду используя zbar

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

 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)
 

Офлайн

#7 Май 25, 2022 11:17:36

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1393
Репутация: +  124  -
Профиль   Отправить e-mail  

Скрипт, который сортирует фото по штрихкоду используя zbar

xam1816
Выложите отрывок файла с фотографиями
я имел ввиду папку с фотографиями товаров - 6 или 9 фоток в папке для теста

Офлайн

#8 Май 25, 2022 11:35:26

maxprof90
Зарегистрирован: 2022-05-25
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт, который сортирует фото по штрихкоду используя zbar

Скидываю фото для тестов.

Прикреплённый файлы:
attachment foto test.zip (891,4 KБ)

Офлайн

#9 Май 25, 2022 11:45:47

maxprof90
Зарегистрирован: 2022-05-25
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт, который сортирует фото по штрихкоду используя zbar

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

Офлайн

#10 Май 25, 2022 12:13:16

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1393
Репутация: +  124  -
Профиль   Отправить e-mail  

Скрипт, который сортирует фото по штрихкоду используя zbar

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version