Привет всем! Сегодня в продолжение записи, посвященной 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
Спасибо за внимание! Все вопросы-мысли-предложения по поводу задачи по сравнению прайсов вы можете озвучить мне лично либо по почте, либо — с помощью он-лайн чатика в правом нижнем углу экрана 😉 И не забывайте кликать на рекламу!