Страницы

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

вторник, 24 декабря 2019 г.

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

#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': 'шт'}]}

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

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