Форум сайта python.su
Добрый день! Мучаюсь четвертый день над задачей. Есть файл txt с блюдами и ингредиентами, нужно прочесть файл и сформировать словарь. Нужно сделать file.read или readline, тут уж как удобнее. Нужен цикл и вложенный цикл. Требуется создать списки и словари, аппендить их и попутно заливать это в вышестоящий словарь.
Название блюда
Количество ингредиентов в блюде
Название ингредиента | Количество | Единица измерения
Название ингредиента | Количество | Единица измерения
Омлет
3
Яйцо | 2 | шт
Молоко | 100 | мл
Помидор | 2 | шт
Утка по-пекински
4
Утка | 1 | шт
Вода | 2 | л
Мед | 3 | ст.л
Соевый соус | 60 | мл
Запеченный картофель
3
Картофель | 1 | кг
Чеснок | 3 | зубч
Сыр гауда | 100 | г
Фахитос
5
Говядина | 500 | г
Перец сладкий | 1 | шт
Лаваш | 2 | шт
Винный уксус | 1 | ст.л
Помидор | 2 | шт
• В одном файле может быть произвольное количество блюд.
• Читать список рецептов из этого файла.
Должен получится следующий словарь
cook_book = {
‘Омлет’: [
{'ingredient_name': ‘Яйцо’, ‘quantity’: 2, ‘measure’: ‘шт.’},
{'ingredient_name': ‘Молоко’, ‘quantity’: 100, ‘measure’: ‘мл’},
{'ingredient_name': ‘Помидор’, ‘quantity’: 2, ‘measure’: ‘шт’}
],
‘Утка по-пекински’: [
{'ingredient_name': ‘Утка’, ‘quantity’: 1, ‘measure’: ‘шт’},
{'ingredient_name': ‘Вода’, ‘quantity’: 2, ‘measure’: ‘л’},
{'ingredient_name': ‘Мед’, ‘quantity’: 3, ‘measure’: ‘ст.л’},
{'ingredient_name': ‘Соевый соус’, ‘quantity’: 60, ‘measure’: ‘мл’}
],
‘Запеченный картофель’: [
{'ingredient_name': ‘Картофель’, ‘quantity’: 1, ‘measure’: ‘кг’},
{'ingredient_name': ‘Чеснок’, ‘quantity’: 3, ‘measure’: ‘зубч’},
{'ingredient_name': ‘Сыр гауда’, ‘quantity’: 100, ‘measure’: ‘г’},
]
}
Максимум что я смог наваять, на скрине.
Но это формирует лишь одно блюдо, я не знаю как продолжить цикл. Может кто-то подскажет?
Прикреплённый файлы:
изображение_2022-05-05_224737076.png (168,8 KБ)
Офлайн
Сделай функцию чтения текста из файла. Функция принимает имя файла и возвращает текст из файла.
Сделай функцию чтения данных из текста. Функция принимает текст и возвращает данные из него в виде словаря.
Сделай функцию чтения списка записей из текста. Функция принимает текст и возвращает список записей в виде текстов из него.
Сделай функцию чтения данных одной записи из текста одной записи. Функция принимает текст одной записи и возвращает словарь с данными этой записи.
Вот текст из файла первой функцией прочитал и во вторую функцию этот текст передал. Вот текст второй функцией прочитал, в третью функцию передал и получил из третьей функции список отдельных текстов. Вот в цикле список отдельных текстов перебираешь, каждый текст подаёшь в четвёртую функцию и словарь, который возвращает четвёртая функция, добавляешь в общий словарь. Когда все тексты перебраны и результаты словари добавлены в общий словарь словарей, тогда ты этот словарь словарей возвращаешь из второй функции.
Офлайн
Спасибо, буду пробовать. О такой стратегии я еще не думал. Пытался все в одной функции поместить и потом вызвать ее.
Офлайн
def read_file(file_path): with open(file_path, 'r', encoding='utf-8') as f: return f.read() def split_text(text): return [i.splitlines() for i in text.split('\n\n')] def split_ingredients_data(lst): return lst[:1] + [i.replace(' ', '').split('|') for i in lst[2:]] def lst_to_dict(lst): return {lst[0]: [{'ingredient_name': i[0], 'quantity': int(i[1]), 'measure': i[2]} for i in lst[1:]]} def data_loads(file_path): out = {} text = read_file(file_path) dish_list = split_text(text) format_dish_list = [split_ingredients_data(i) for i in dish_list] for i in format_dish_list: out.update(lst_to_dict(i)) return out res = data_loads('my_file.txt') print(res)
{'Омлет': [{'ingredient_name': 'Яйцо', 'quantity': 2, 'measure': 'шт'}, {'ingredient_name': 'Молоко', 'quantity': 100, 'measure': 'мл'}, {'ingredient_name': 'Помидор', 'quantity': 2, 'measure': 'шт'}], 'Утка по-пекински': [{'ingredient_name': 'Утка', 'quantity': 1, 'measure': 'шт'}, {'ingredient_name': 'Вода', 'quantity': 2, 'measure': 'л'}, {'ingredient_name': 'Мед', 'quantity': 3, 'measure': 'ст.л'}, {'ingredient_name': 'Соевыйсоус', 'quantity': 60, 'measure': 'мл'}], 'Запеченный картофель': [{'ingredient_name': 'Картофель', 'quantity': 1, 'measure': 'кг'}, {'ingredient_name': 'Чеснок', 'quantity': 3, 'measure': 'зубч'}, {'ingredient_name': 'Сыргауда', 'quantity': 100, 'measure': 'г'}], 'Фахитос': [{'ingredient_name': 'Говядина', 'quantity': 500, 'measure': 'г'}, {'ingredient_name': 'Перецсладкий', 'quantity': 1, 'measure': 'шт'}, {'ingredient_name': 'Лаваш', 'quantity': 2, 'measure': 'шт'}, {'ingredient_name': 'Винныйуксус', 'quantity': 1, 'measure': 'ст.л'}, {'ingredient_name': 'Помидор', 'quantity': 2, 'measure': 'шт'}]}
Process finished with exit code 0
Офлайн
xam1816По именам замечание:def read_file(file_path):
def split_text(text):
def split_ingredients_data(lst):
def lst_to_dict(lst):
def data_loads(file_path):
Отредактировано py.user.next (Май 8, 2022 01:26:36)
Офлайн