Найти - Пользователи
Полная версия: Прочитать текстовый файл и получить словарь со вложенными списками и словарями.
Начало » Python для новичков » Прочитать текстовый файл и получить словарь со вложенными списками и словарями.
1
INRI
Добрый день! Мучаюсь четвертый день над задачей. Есть файл 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’: ‘г’},
]
}


Максимум что я смог наваять, на скрине.

Но это формирует лишь одно блюдо, я не знаю как продолжить цикл. Может кто-то подскажет?
py.user.next
Сделай функцию чтения текста из файла. Функция принимает имя файла и возвращает текст из файла.
Сделай функцию чтения данных из текста. Функция принимает текст и возвращает данные из него в виде словаря.
Сделай функцию чтения списка записей из текста. Функция принимает текст и возвращает список записей в виде текстов из него.
Сделай функцию чтения данных одной записи из текста одной записи. Функция принимает текст одной записи и возвращает словарь с данными этой записи.

Вот текст из файла первой функцией прочитал и во вторую функцию этот текст передал. Вот текст второй функцией прочитал, в третью функцию передал и получил из третьей функции список отдельных текстов. Вот в цикле список отдельных текстов перебираешь, каждый текст подаёшь в четвёртую функцию и словарь, который возвращает четвёртая функция, добавляешь в общий словарь. Когда все тексты перебраны и результаты словари добавлены в общий словарь словарей, тогда ты этот словарь словарей возвращаешь из второй функции.
INRI
Спасибо, буду пробовать. О такой стратегии я еще не думал. Пытался все в одной функции поместить и потом вызвать ее.
xam1816
  
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
py.user.next
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):
По именам замечание:
Имя функции должно быть сформировано в императивной форме. Есть две формы: императивная форма и декларативная форма. Императивная форма отвечает на вопрос “что сделать?”. Декларативная форма отвечает на вопрос “что делает?”.

read_file - что сделать? прочитать файл. окей, всё понятно.

split_text - что сделать? разделить текст. окей, всё понятно.

split_ingredients_data - что сделать? разделить данные ингредиентов. окей, всё понятно.

lst_to_dict - что сделать? хуй знает, не знаю. что-то написано, а что - непонятно. то ли оно делает что-то, то ли оно не делает ничего. список в словарь что? преобразовать, скопировать, перенести? список к словарю что? прибавить, добавить, приблизить? слово to в английском языке многозначное. можно сказать go to the shop, а можно сказать come to me. в одном случае оно означает иди “в”, а в другом случае оно означает подойди “к”. поэтому тут можно трактовать как “список в словарь”, а можно трактовать как “список к словарю”.

data_loads - что сделать? да хер его знает. что-то там происходит внутри, а что происходит внутри?

Поэтому вот эти два имени надо переделать:
convert_list_to_dict - что сделать? сконвертировать список в словарь. окей, всё понятно.
load_data - что сделать? загрузить данные. окей, всё понятно.

А декларативная форма используется в проверках всяких.
str.isdigit - что делает? является цифрой. окей, всё понятно.
str.endswith - что делает? оканчивается на что-то. окей, всё понятно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB