Как собрать структуру данных из списка
имеется excel файл, который выглядит вот так
нужно как то сохранить в базе данных структуру этого(и других похожих файлов) в таком виде(соре за криворукость рисовал как мог)
тоесть есть несколько разделов(их может быть любое количество)
Разделы делятся на этапы (но бывает что в разделе нет этапов как в разделе 1 на скриншоте)
этапы делятся на СРК
А СРК в свою очередь на Механизмы и материалы(цена по прайсу)
я спарсил данные в список где все нужные данные идут подряд (список состоящий из строк и других списков описывающих материалы или механизмы и срк
Раздел 1. Устройство перекрытия
['СРК 3-008', 'Устройство пароизоляции прокладочной в один слой']
['Цена по прайсу', 'Пароизооляция Изоспан В (70м2)', 'рул', '2', '1260']
['Цена по прайсу', 'Соединительная лента Изоспан KL 15 мм, L=50 м', 'рул', '5', '350']
['Цена по прайсу', 'Металлизированная лента Delta-Multi Band 60 мм, L=25 м', 'рул', '9', '1185']
['Цена по прайсу', 'Мембрана пароизоляционная Tyvek AirGuard SD5 (1.5х50 м)', 'рул', '2', '11850']
['Цена по прайсу', 'Соединительная лента односторонняя Tyvek Acrylic Tape (0,06х25 м)', 'рул', '6', '1200']
['СРК 3-009', 'Подшивка чернового потолка разреженная 25 х 150 мм.']
['Цена по прайсу', 'Саморез универсальный 5х60 мм.', 'шт.', '1190', '1.2']
['Цена по прайсу', 'Доска 25х150 обрезная естественной влажности', 'м3', '1.3', '9300']
['СРК 3-010', 'Утепление минватой чердачного пространства']
['СРК 6-006', 'Обработка огнебиозащитой древесины']
['Механизмы', 'Пульвелизатор', 'маш.час', '1', '600']
['Цена по прайсу', 'Огнебио защита', 'кг', '59', '142']
Раздел 2. Устройство кровли
Стропильная и подстропильная система
['СРК 6-003', 'Монтаж гидроизоляции под чердачную кровлю']
['Цена по прайсу', 'Гидро-ветрозащитная мембрана Изоспан АМ (70 м2)', 'рул', '5', '2450']
['СРК 6-005', 'Устройство контробрешётки 50 х 50 мм.']
['Цена по прайсу', 'Брусок 50х50', 'м3', '1.7', '12000']
['Цена по прайсу', 'Гвозди 90 мм', 'кг.', '19', '75']
['СРК 6-004', 'Устройство обрешётки разреженной 25 х 150 мм.']
['Цена по прайсу', 'Доска 25х150 обрезная естественной влажности', 'м3', '4.2', '9300']
['Цена по прайсу', 'Саморез универсальный 5х60 мм.', 'шт.', '2600', '1.2']
Чистовое покрытие - Гибкая черепица
['СРК 6-018', 'Устройство покрытий под кровлю из плит ОСП 9 мм']
['Цена по прайсу', 'Гвозди кровельные оцинкованные ершённые', '5 кг', '3.7', '764']
['СРК 6-019', 'Настил подкладочного ковра под черепицу']
['Цена по прайсу', 'Гвозди кровельные оцинкованные ершённые', '5 кг', '0.8', '764']
['Цена по прайсу', 'Подкладочный ковер ANDEREP PROF ТехноНиколь (1х40 м)', 'рул', '8', '4650']
['СРК 6-020', 'Монтаж коньково-карнизной черепицы (стартовая)']
['Цена по прайсу', 'Коньково-карнизная черепица Docke PIE STANDART/ Зеленый, Коричневый, Красный, Серый (11 м2/22 мп)', 'уп.', '6', '2951']
['СРК 6-021', 'Монтаж гибкой черепицы мягкой кровли']
['Цена по прайсу', 'Гибкая черепица Docke PIE STANDART/ СОТА/ Зеленый, Коричневый, Красный, Серый 3м2', 'уп.', '91', '1167']
['Цена по прайсу', 'Гвозди кровельные оцинкованные ершённые', '5 кг', '3.1', '764']
['Цена по прайсу', 'Мастика для гибкой черепицы (10 л)', 'шт', '4', '2156']
['СРК 6-011', 'Монтаж карнизной планки мягкой кровли']
['Цена по прайсу', 'Карниз металлический окраш. (Фартук S 1, ПЭ) (103х60х15) (L=2 м)', 'шт', '22', '256']
['Цена по прайсу', 'Вент. лента 100х5000мм.', 'м', '42', '70']
['СРК 6-012', 'Монтаж торцевой планки мягкой кровли']
['Цена по прайсу', 'Торцевая планка металлическая окраш. (Фартук S 5, ПЭ) (110х35х90х10) (L=2 м)', 'шт', '21', '350']
['СРК 6-016', 'Монтаж ендовых']
['Цена по прайсу', 'Ендовый ковер Docke PIE/ 1000/ все цвета (10 мп)', 'рул.', '1.2', '4599']
['СРК 6-022', 'Монтаж аэратора мягкой кровли']
['Цена по прайсу', 'Коньковый аэратор Docke PIE (1 п.м)', 'шт', '15', '486']
['Цена по прайсу', 'Фильтр для конькового аэратора Docke', 'шт', '30', '79']
['СРК 6-015', 'Монтаж примыкания']
['Цена по прайсу', 'Ендовый ковер Docke PIE/ 1000/ все цвета (10 мп)', 'рул.', '0.8', '4599']
['Цена по прайсу', 'Герметик силиконовый универсальный (бесцветный), 300 мл', 'упак', '2', '254']
['Цена по прайсу', 'Саморез универсальный 4х40 мм.', 'шт.', '105', '0.56']
['Цена по прайсу', 'Дюбель универсальный 6х42', 'шт', '105', '0.45']
['Цена по прайсу', 'Планка угла внутреннего МП 200х200х3000 (0.45 мм ПЭ)', 'шт', '5', '1100']
['СРК 6-031', 'Монтаж дефлектора']
['Цена по прайсу', 'Проходной элемент для труб O110-160 мм', 'шт', '4', '1460']
['Цена по прайсу', 'Выход канализации изолированный Ф110/160/500 мм', 'шт', '1', '2550']
['Цена по прайсу', 'Выход вытяжки изолированный с колпаком Ф125/160/500 мм', 'шт', '3', '3800']
['Цена по прайсу', 'Колпак для трубы Ф110 мм', 'шт', '4', '630']
['СРК 6-032', 'Монтаж снегозадержателей']
['Цена по прайсу', 'Снегозадержатель для гибкой черепицы (снегостопор)', 'шт', '180', '43']
Устройство карнизов из металлического софита
['СРК 6-009', 'Подшивка карниза софитом металлическим']
['Цена по прайсу', 'Саморез "клоп" 3.8х11 мм.', 'шт.', '1550', '0.48']
['Цена по прайсу', 'МП Софит Lбрус-15х240 (ПЭ-01-0.45) перфорированный (L=3 м)', 'шт.', '113', '360']
['Цена по прайсу', 'Планка J-профиль 24х18х2000 (ПЭ, 0,45)', 'шт.', '61', '180']
['СРК 6-017', 'Монтаж лобовой доски Norman']
['Цена по прайсу', 'Планка карнизного свеса 250х50х2000 (ПЭ-0,1-окраш.-0,45)', 'шт.', '22', '400']
['Цена по прайсу', 'Саморез "клоп" 3.8х11 мм.', 'шт.', '350', '0.48']
['СРК 6-022', 'Монтаж лобовой доски из сайдинга']
['Цена по прайсу', 'МП Софит Lбрус-15х240 (ПЭ-01-0.45) сплошной (L=3 м)', 'шт', '19', '360']
['Цена по прайсу', 'Фасонное изделие (уголок наруж. 50х50х2000 мм)', 'шт', '23', '280']
['Цена по прайсу', 'Саморез "клоп" 3.8х11 мм.', 'шт.', '440', '0.48']
Устройство водосточной системы
['СРК 6-014', 'Монтаж водосточных желобов']
['Цена по прайсу', 'Docke желоб водосточый D125х3000 (Premium)', 'шт.', '14', '463']
['Цена по прайсу', 'Docke соединитель желоба D125 (Premium)', 'шт.', '14', '154']
['Цена по прайсу', 'Docke заглушка желоба D125 (Premium)', 'шт.', '6', '74']
['Цена по прайсу', 'Docke кронштейн желоба карнизный (Premium)', 'шт.', '69', '50']
['Цена по прайсу', 'Docke воронка водосборная (Premium)', 'шт.', '7', '279']
['Цена по прайсу', 'Docke сетка защитная (Premium)', 'шт.', '7', '58']
['Цена по прайсу', 'Угловой элемент желоба 90° Docke (Premium)', 'шт.', '2', '240']
['СРК 6-013', 'Монтаж водосточных труб']
['Цена по прайсу', 'Docke Труба водосточная D100х3000 (Premium)', 'шт.', '10', '561']
['Цена по прайсу', 'Docke соеденитель (муфта) трубы (Premium)', 'шт', '4', '93']
['Цена по прайсу', 'Docke колено трубы D100 (Premium)', 'шт', '14', '173']
['Цена по прайсу', 'Docke держатель трубы D100 (на кирпич)', 'шт.', '31', '87']
['Цена по прайсу', 'Docke колено сливное D100 (Premium)', 'шт', '7', '207']
Раздел 3. Доставка
далее я смог получить айди каждой сущности в этой структуре
data = estimate_parser('2.xlsx') # получаем тут список что я написал выше
print(data)
for item in data:
print(item)
if 'Раздел' in item:
section_ids.append(data[data.index(item)])
if isinstance(item, str) and 'Раздел' not in item:
stage_ids.append(data[data.index(item)])
if len(item) == 2:
srk_ids.append(data[data.index(item)])
if len(item) == 5 and 'Цена по прайсу' in item:
material_ids.append(data[data.index(item)])
if len(item) == 5 and 'Механизмы' in item:
mechanic_ids.append(data[data.index(item)])
Теперь у меня созрел вопрос как это все подготовить для сохранения в бд я думал использовать вложенные словари многоуровневые , но как собрать их я пока не могу понять, неделю уже думаю над этим вопросом
Как это можно реализовать?(если есть предложения как еще можно хранить такую структуру,тоже приму во внимания)
Заранее благодарю за ответ
Ответы (1 шт):
Если я вас правильно понял то так
new_list = []
for i in range(len(list_)):
new_list.append(list_[i])
if "Раздел" in list_[i]:
index = i + 1
if index >= len(list_) or type(list_[index]) != str:
new_list.append("Раздел")
list_ = new_list
dict_ = {}
last_el = [None, None]
for el in list_:
if "Раздел" in el:
dict_[el] = {}
last_el[0] = el
elif type(el) == str:
dict_[last_el[0]][el] = {}
last_el[1] = el
else:
key, *value = el
if key in dict_[last_el[0]][last_el[1]]:
dict_[last_el[0]][last_el[1]].append(value)
else:
dict_[last_el[0]][last_el[1]] = [value]