Страницы

Поиск по вопросам

понедельник, 26 ноября 2018 г.

Открытие и чтение файла, запись в файл

Помогите решить задачку.
У меня есть файл с данными:
Омлет 3 Яйцо | 2 | шт Молоко | 100 | мл Помидор | 2 | шт
Утка по-пекински 4 Утка | 1 | шт Вода | 2 | л Мед | 3 | ст.л Соевый соус | 60 | мл
Запеченный картофель 3 Картофель | 1 | кг Чеснок | 3 | зубч Сыр гауда | 100 | г
Фахитос 5 Говядина | 500 | г Перец сладкий | 1 | шт Лаваш | 2 | шт Винный уксус | 1 | ст.л Помидор | 2 | шт
Его нужно привести к:
cook_book = { 'Омлет': [ {'ingridient_name': 'Яйцо', 'quantity': 2, 'measure': 'шт.'}, {'ingridient_name': 'Молоко', 'quantity': 100, 'measure': 'мл'}, {'ingridient_name': 'Помидор', 'quantity': 2, 'measure': 'шт'} ], 'Утка по-пекински': [ {'ingridient_name': 'Утка', 'quantity': 1, 'measure': 'шт'}, {'ingridient_name': 'Вода', 'quantity': 2, 'measure': 'л'}, {'ingridient_name': 'Мед', 'quantity': 3, 'measure': 'ст.л'}, {'ingridient_name': 'Соевый соус', 'quantity': 60, 'measure': 'мл'} ], 'Запеченный картофель': [ {'ingridient_name': 'Картофель', 'quantity': 1, 'measure': 'кг'}, {'ingridient_name': 'Помидор', 'quantity': 2, 'measure': 'шт'}, {'ingridient_name': 'Сыр гауда', 'quantity': 100, 'measure': 'г'}, ] }
Мой код:
cook_book_dict = dict() cook_book_ingredients_list = list() with open('dishes_list.txt', encoding="utf - 8") as f: for line in f: del cook_book_ingredients_list[:] dish_name = line.strip() s = int(f.readline().strip()) while s != 0: string = f.readline().strip() line_ingr= string.split("|") cook_book_ingredients_list.append({''[{'ingridient_name': line_ingr[0].strip(), 'quantity': line_ingr[1].strip(),'measure': line_ingr[2].strip()}]}) print(cook_book_ingredients_list)
Выдает ошибку:
TypeError: string indices must be integers
У меня это слабая тема, не могу никак разобраться(


Ответ

import json
keys = ['ingridient_name', 'quantity', 'measure', ] with open('dishes_list.txt') as text: lines = filter(bool, map(str.strip, text)) cook_book_dict = {n: [{k: v for (k, v) in zip(keys, map(str.strip, next(lines).split(' | ', 2)))} for _ in range(int(next(lines)))] for n in lines} print(json.dumps(cook_book_dict, indent=2, ensure_ascii=False))
особо не знаю что тут пояснять, просто разверну
import json
keys = ['ingridient_name', 'quantity', 'measure', ] cook_book_dict = {}
with open('dishes_list.txt') as text: # только непустые линии lines = [] for line in text: line = line.strip() if line: lines.append(line) continue lines = iter(lines) # https://docs.python.org/3/library/functions.html#iter
# далее выталкиваем текст из iter for name in lines: # шаг_1 - вытолкнутая тут линия - всегда блюдо cook_book_dict[name] = [] num = next(lines) # шаг_2 - следующая за блюдом - всегда номер
for _ in range(int(num)): # шаг_3 - затем надо вытолкнуть из iter - num линий состава блюда sostav_line = next(lines) # одна из линий состава ingrid = sostav_line.split(' | ') # разбить на ингридиенты z = zip(keys, ingrid) # сопоставить ключ - https://docs.python.org/3/library/functions.html#zip sostav_dict = {k: v for (k, v) in z} # генератор словаря ингридиентов cook_book_dict[name].append(sostav_dict) continue
# тк все линии не пустые, и мы вытолкнули все линии текущего юляда, следующая лиция опять будет - блюдо continue
print(json.dumps(cook_book_dict, indent=2, ensure_ascii=False))

Комментариев нет:

Отправить комментарий