Уведомления

Группа в Telegram: @pythonsu

#1 Июль 8, 2020 20:01:53

Andrew2525
Зарегистрирован: 2020-07-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание вложенных списков из эксель файла

Добрый день!
Есть эксель файл с данными о продажах, состоящий из 4 полей: клиент, продукт, количество купленного товара, количество проданного товара.
Задача: пройтись по файлу и поместить все данные в список списков. При этом значения должны быть сгруппированы по Клиенту и Продукту, так как в файле есть повторяющиеся Клиент&Продукт.

Код ниже выдает пустой список, я понимаю почему (после continue переходит к основному циклу), но не понимаю куда мне двигаться дальше и как правильно построить вложенные циклы, чтобы осуществить проверку наличия элемента в списке перед добавлением.
Подскажите, пожалуйста.

 import openpyxl
wb = openpyxl.load_workbook(filepath)
sheet = wb.active
client = sheet['A']
product = sheet['B']
sellin = sheet['C']
sellout = sheet['D']
sales_list = []
for i in range(len(client)):
    for j in range(len(sales_list)):
        one_string = []
        if client[j][0] != client[i].value and product != product[i].value:
            continue
        elif client[j][0] == client[i].value and product == product[i].value:
            sales_list[j][2] = sales_list[j][2] + sellin[i].value
            sales_list[j][3] = sales_list[j][3] + sellout[i].value
            break
        else:
            one_string.append(client[i].value)
            one_string.append(product[i].value)
            one_string.append(sellin[i].value)
            one_string.append(sellout[i].value)
            sales_list.append(one_string)

Офлайн

#2 Июль 8, 2020 21:44:50

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Создание вложенных списков из эксель файла

Andrew2525
Код ниже выдает пустой список, я понимаю почему (после continue переходит к основному циклу)
Код выдает по другой причине.
Изначально ты определил sales_list = , а потом пытаешься пройти циклом исходя из его длины, но его длина равна 0 и ты не заходишь НИКОГДА во второй цикл. Вот и ответ тебе пустой список
 for i in range(0):
    print(1)
print('OK')

Отредактировано Romissevd (Июль 8, 2020 21:45:31)

Офлайн

#3 Июль 8, 2020 22:03:18

Andrew2525
Зарегистрирован: 2020-07-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание вложенных списков из эксель файла

Подскажи, пожалуйста, с кодом, чтобы выполнить эту задачу.

Офлайн

#4 Июль 8, 2020 23:02:19

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

Создание вложенных списков из эксель файла

Andrew2525
Подскажи, пожалуйста, с кодом, чтобы выполнить эту задачу.
скинь эксель файл с которым работаешь,или отрывок чтобы попробовать

Офлайн

#5 Июль 8, 2020 23:29:47

Andrew2525
Зарегистрирован: 2020-07-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание вложенных списков из эксель файла

xam1816
скинь эксель файл с которым работаешь,или отрывок чтобы попробовать
Отрывок из файла так выглядит:

Клиент Продукт Количество куплено Количество продано
ИП 1 Хлеб 567 100
ИП 2 Молоко 68 200
ИП 3 Яйца 578 300
ИП 4 Сыр 4 400
ИП 1 Хлеб 56 500
ИП 2 Молоко 456 600
ИП 5 Молоко 200 100
ИП 6 Молоко 600 200
ИП 7 Молоко 5 300

Офлайн

#6 Июль 9, 2020 00:37:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Создание вложенных списков из эксель файла

Andrew2525
Подскажите, пожалуйста.
Сначала нужно ввести данные из Excel-файла в питон напрямую, без преобразований. Потом уже из этих введённых данных можно получить нужную структуру.

Сейчас вся сложность кода берётся из того, что ты пытаешься всё сразу сделать. А нужно сначала данные максимально почистить от всего лишнего, а уже потом с чистыми данными работать в соответствии с желаемым результатом. Это как картошку жарить: сначала нужно её помыть; потом её мытую почистить; потом её почищенную нарезать на фрагменты; потом эти фрагменты высыпать на сковородку; потом жарить. А ты пытаешься пожарить картошку, нарезав её сразу на фрагменты и высыпав их на сковородку, когда она вся в грязи и непочищенная, а потом спрашиваешь “а чо у меня комки грязи на сковородке? как убрать грязь со сковородки? и чо кожура такая невкусная у картошки?”.

Вот для начала избався от влияния Excel-формата на данные. Просто переведи их хотя бы в текст, чтобы питон видел только текст, с которым нужно работать.



Отредактировано py.user.next (Июль 9, 2020 00:38:45)

Офлайн

#7 Июль 9, 2020 00:59:25

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

Создание вложенных списков из эксель файла

так?

 import openpyxl
wb = openpyxl.load_workbook(filepath)
sheet = wb.active
client = sheet['A']
product = sheet['B']
sellin = sheet['C']
sellout = sheet['D']
sales_list = []
for cl,pr,s_in,s_out in zip(client,product,sellin,sellout):
    sales_list.append((cl.value,pr.value,s_in.value,s_out.value))
sales_list.sort()
for i in sales_list:
    print(i)

Офлайн

#8 Июль 9, 2020 09:45:53

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Создание вложенных списков из эксель файла

Нет не так

 import xlrd
def load_page(nm:str, ipage:int=0)->list:
    wb = xlrd.open_workbook(nm)
    sheet = wb.sheet_by_index(ipage)
    return [sheet.row_values(i) for i in range(sheet.nrows)]
data = load_page("a.xlsx")
data.sort()
Вы не довели данные до чисто питоновских типов, поэтому лезут values. Не отделили операцию чтения. Захадкодили количество столбцов. Это резко ограничило возможности повторного использования кода для чтения данных.

Ну и наконец openpyxl предназначен в первую очередь для создания экселовских файлов. А вам нужно чтение. Те инструмент выбран неудачно.



Отредактировано doza_and (Июль 9, 2020 09:49:52)

Офлайн

#9 Июль 9, 2020 19:00:23

Andrew2525
Зарегистрирован: 2020-07-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание вложенных списков из эксель файла

doza_and
Захадкодили количество столбцов
Я это сделал, поскольку у меня также есть другой эксель файл, в котором есть много других ненужных полей, мне же нужны данные только из четырех.

doza_and
Ну и наконец openpyxl предназначен в первую очередь для создания экселовских файлов.
В документации библиотеки указано, что ее можно использовать для чтения файлов. Подскажите, почему инструмент выбран неудачно?

Офлайн

#10 Июль 10, 2020 10:17:28

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Создание вложенных списков из эксель файла

Конечно делать можно как угодно, универсальных рекомендаций не бывает.
В начале пишете:

Andrew2525
Есть эксель файл с данными о продажах, состоящий из 4 полей
В конце вдруг оказывается:
Andrew2525
Я это сделал, поскольку у меня также есть другой эксель файл
Такие вещи надо сразу в техническом задании указывать.
Но я бы предпочел сначала получить все данные, а потом уж выбирать то что надо. Это так называемый принцип решения только одной задачи в одном месте. Кусок который только читает проще. Кроме того вы сможете его использовать при решении других задачек которые потом у вас возникнут.
Конечно иногда можно решать и несколько задачек, если они простые, или это нужно по соображениям эффективности.

Andrew2525
В документации библиотеки указано, что ее можно использовать для чтения файлов. Подскажите, почему инструмент выбран неудачно?
Я давненько не работал с экселом. В свое время при работе с заказчиками жестко договорились что мы вообще не принимаем данные в формате exel (Люди всегда там чего-то нарукоблудят. Изменят формат ячейки, напихают формул, пустых строк, импортнут данные, а эксел плавающие числа в даты переделает, продолжать этот список потенциальных косяков можно до бесконечности). Если данные простенькие то csv или архив с csv файлами. Если сложные то hdf5 или sqlite. Такое организационное решение сразу ликвидировало кучу проблем.
xlrd Позволяет сразу получать данные для всего столбца или всей строки, чем он удобнее. Но текущий статус библиотеки неясен, похоже проблемы с поддержкой.

Классическое решение pandas. он загрузит все данные одной строкой. Правда там проблема с тем что он огромный и своеобразный.

На текущий момент при решении вашей задачи я бы посмотре в сторону http://docs.pyexcel.org/en/latest/

тк ваша задача не модифицировать эксел файл со всеми его премудростями а просто извлечь данные. Те эта библиотека будет гораздо проще в использовании. Прочитал и про эксел сразу забыли, а не так как у вас - когда программа оперирует понятиями из эксела - колонка строка ячейка содержимое ячейки и т п.



Отредактировано doza_and (Июль 10, 2020 10:23:30)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version