#python
Помогите решить задачку. У меня есть файл с данными: Омлет 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 У меня это слабая тема, не могу никак разобраться(
Ответы
Ответ 1
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))Ответ 2
import re with open('dishes_list.txt', encoding="utf-8") as f: text = f.read() def parse_block(block): name, _, data = block.partition('\n') data = re.findall(r'[\r\n]([^\r\n\d]*)\s+\|\s*(\d+)\s+\|\s*([^\r\n\|]*)', data) return {name:[dict(ingridient_name=tup[0], quantity=int(tup[1]), measure=tup[2])] for tup in data} res = {name:data for block in text.split('\n\n') for name, data in parse_block(block).items()} результат: {'Омлет': [{'ingridient_name': 'Помидор', 'quantity': 2, 'measure': 'шт'}], 'Утка по-пекински': [{'ingridient_name': 'Соевый соус', 'quantity': 60, 'measure': 'мл'}], 'Запеченный картофель': [{'ingridient_name': 'Сыр гауда', 'quantity': 100, 'measure': 'г'}], 'Фахитос': [{'ingridient_name': 'Помидор', 'quantity': 2, 'measure': 'шт'}]}
Комментариев нет:
Отправить комментарий