задачи по сравнению прайсов

Openpyxl и задачи по сравнению прайсов

Привет всем! Сегодня в продолжение записи, посвященной Python и работе с Excel я поделюсь своим вариантом решения задачи по сравнению прайсов (о ней говорилось тут).

Итак, у нас имеется некоторое количество прайс-листов, которые нужно сравнить с нашим (для упрощения задачи предположим, что структура прайс-листов совершенно одинакова). Значит, нам понадобится библиотека Openpyxl (для работы с файлами Excel), и библиотека Glob, благодаря которой мы сможем сформировать список файлов для работы. Подключаем их:
import openpyxl #Библиотека для обработки файлов Excel
import glob #Библиотека для работы с файлами

Теперь нужно понять, где находится наш прайс-лист, и прайс-листы конкурентов. Для этого вводим в программу две переменных: original_path — отвечает за путь к нашему прайс-листу, и path — переменная, обозначающая путь к каталогу с прайс-листами конкурентов.
original_path = ‘ ‘ #Путь к прайсу с нашими ценами
path = ‘ ‘ #Задали переменную с путем к рабочей папке

Настала пора сформировать список, содержащий все файлы с расширением .xlsx — на случай, если вдруг в папке с прайс-листами конкурентов окажутся иные файлы. Для этого используем библиотеку glob:
list_files = glob.glob(path + ‘*.xlsx’) #Сформировали переменную, содержащую список всех файлов Excel в рабочей папке

Начинаем обработку файлов. Учитывая, что количество файлов неизвестно, используем цикл for, который будет работать пока не обработает все файлы в списке:
for file in list_files:
    print(‘Обрабатываем файл: ‘, file) #Выводим сообщение — какой файл в обработке

Теперь начинаем получать данные из нашего прайс-листа:
    wb_orig = openpyxl.load_workbook(original_path) #Открываем Excel-файл
    sheets_list_original = wb_orig.sheetnames #Создали переменную, содержащую список всех листов в открытом Excel-файле
     sheet_active_original = wb_orig[sheets_list_original[0]] #Создали переменную, содержащую первую страницу в открытом файле
    row_count_original = sheet_active_original.max_row #Получили количество строк в открытом файле
    column_count_original = sheet_active_original.max_column #Получили количество строк в открытом файле

Теперь, когда у нас есть все необходимые данные из нашего прайс-листа аналогично получаем данные из прайс-листа конкурентов:
    wb = openpyxl.load_workbook(file) #Открыли прайс-лист конкурентов
    sheets_list = wb.sheetnames #Получили список всех листов в открытом файле
    sheet_active = wb[sheets_list[0]] #Сделали активной самую первую страницу
    row_count = sheet_active.max_row #Получили количество строк на странице
    column_count = sheet_active.max_column #Получили количество колонок на странице

Кажется, теперь пора сравнивать цены и позиции. Но я решил добавить проверку на соответствие прайсов друг другу. Делается это просто: учитывая, что изначально прайс-листы равны по количеству товаров, но не по стоимости товаров, я решил делать проверку по количеству колонок и строк. Если они равны — программа работает дальше. Если нет — программа выдает сообщение о ошибке:
    print(‘В нашем прайсе’, original_path, ‘\n — строк: ‘, row_count_original, ‘\n — колонок: ‘, column_count_original)
    print(‘В документе’, file, ‘\n — строк: ‘, row_count, ‘\n — колонок: ‘, column_count, ‘\n’)
    if row_count != row_count_original or column_count != column_count_original:
        print(‘Прайсы не совпадают, проверьте данные! \n’)
        break
    else:
        print(‘Прайсы совпадают, работаем! \n’)

Создаем переменные, отвечающие за начальное значение ячейки и колонки:
        max_row = 1
        worksheet_a = ‘A’
        worksheet_b = ‘B’

И теперь, наконец, начинаем обработку данных:
        while max_row <= row_count: #Начинаем цикл, который будет обрабатывать данные поячеечно
        cell_a = worksheet_a + str(max_row) #Создаем переменную, которая состоит из рабочей ячейки и номера
        cell_b = worksheet_b + str(max_row) #Создаем переменную, которая состоит из рабочей ячейки и номера
        from_cell_a = sheet_active[cell_a].value #Получаем значение ячейки A из прайса конкурентов
        from_cell_b = sheet_active[cell_b].value #Получаем значение ячейки B из прайса конкурентов
        from_cell_a_orig = sheet_active_original[cell_a].value #Получаем значение ячейки А из нашего прайса
        from_cell_b_orig = sheet_active_original[cell_b].value #Получаем значение ячейки В из нашего прайса
        if from_cell_b > from_cell_b_orig: #Начинаем ветку на случай, если у конкурентов товар дороже
            print(from_cell_a, ‘: \n — у конкурентов: ‘, from_cell_b, ‘\n — у нас: ‘, from_cell_b_orig)
            print(‘У конкурентов позиция дороже!\n’)
            # Пишем в итоговый файл все — пока еще в процессе доработки
        elif from_cell_b < from_cell_b_orig: #А эта ветка отвечает за случай, если у конкурентов товар дешевле
            print(from_cell_a, ‘: \n — у конкурентов: ‘, from_cell_b, ‘\n — у нас: ‘, from_cell_b_orig)
            print(‘У конкурентов позиция дешевле\n’)
            #Пишем в итоговый файл все — пока еще в процессе доработки
        elif from_cell_b == from_cell_b_orig: #Данная ветка — на случай, если стоимость товарной позиции равна
            print(from_cell_a, ‘: \n — у конкурентов: ‘, from_cell_b, ‘\n — у нас: ‘, from_cell_b_orig)
            print(‘Стоимость товара равная\n’)
            #Пишем в итоговый файл все — пока еще в процессе доработки 🙂
        max_row = max_row + 1

#Увеличиваем значение переменной на единицу, что бы цикл работал верно

В полном виде код доступен по ссылке на Git

В планах на самое ближайшее время дописать все же код: результаты проверки стоимости товарной позиции записываются постранично в итоговый Excel-файл с цветовым выделением. И оптимизировать код — ибо многие вещи можно сделать с помощью процедур, но я с ними почему-то не дружу 🙂 Но научусь, фигли…
Спасибо за внимание! Все вопросы-мысли-предложения по поводу задачи по сравнению прайсов вы можете озвучить мне лично либо по почте, либо — с помощью он-лайн чатика в правом нижнем углу экрана 😉 И не забывайте кликать на рекламу!