Привет всем! Сегодня в продолжение записи, посвященной 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-файл с цветовым выделением. И оптимизировать код — ибо многие вещи можно сделать с помощью процедур, но я с ними почему-то не дружу 🙂 Но научусь, фигли…
import openpyxl
import glob #Библиотека для работы с файлами
print('Начинаем работу: \n')
#Формируем список файлов для работы
original_path = 'c:\\Users\\Oleksiy\\Desktop\\Git\\Netology\\Excel\\Original\\Original_price.xlsx' #Путь к прайсу с нашими ценами
path = 'c:\\Users\\Oleksiy\\Desktop\\Git\\Netology\\Excel\\' #Задали переменную с путем к рабочей папке
list_files = glob.glob(path + '*.xlsx') #Сформировали переменную, содержащую список всех файлов Excel в рабочей папке
print(glob.glob(path + '*.xlsx')) #Вывели список всех файлов с расширением Excel
for file in list_files:
print('Обрабатываем файл: ', file)
#Получаем данные из нашего прайса (для сравнения)
wb_orig = openpyxl.load_workbook(original_path)
sheets_list_original = wb_orig.sheetnames
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
Спасибо за внимание! Все вопросы-мысли-предложения по поводу задачи по сравнению прайсов вы можете озвучить мне лично либо по почте, либо - с помощью он-лайн чатика в правом нижнем углу экрана 😉 И не забывайте кликать на рекламу!
Support the Blog!
Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️