/
b_radzinski
/
Homework
Обзор
Документация
Войти
/
b_radzinski
/
Homework
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
cookbook.py
82 строки
4 KB
Mazainsk
Files HW, to review
24 июн 2025, 07:23
24 июн 2025, 07:23
fae8bc6
Код
Авторство
О чём код?
# Домашнее задание к лекции «Открытие и чтение файла, запись в файл» import os from pprint import pprint FILE_NAME = 'recipes.txt' TEST_FILE_NAMES = ('1.txt', '2.txt', '3.txt') PATH_ = 'exercise3' OUTPUT_FILE_NAME = 'merged_test_file.txt' def reading_cook_book(filename): """ Функция читает файл кулинарной книги со списком блюд и ингредиентов для них; возвращает словарь. """ def read_ingredient(counter): all_ingredients = [] counter = int(counter) for i in range(counter): ingredient_data = list(f.readline().removesuffix('\n').split(' | ')) ingredient_data[1] = int(ingredient_data[1]) # Количество ингредиента - всегда целое число all_ingredients.append(dict(zip(('ingredient_name', 'quantity', 'measure'), ingredient_data))) return all_ingredients with open(filename, encoding='UTF-8') as f: cook_book ={} while dish_name := f.readline().removesuffix('\n'): cook_book.update({dish_name: read_ingredient(f.readline())}) while f.readline().rstrip(): # Пропуск всех пустых строк между блюдами pass return cook_book def get_shop_list_by_dishes(dishes, person_count): """ Функция принимает список блюд из cook_book и количество персон (множитель для ингредиентов), на выходе - словарь с названием ингредиентов и их общим количеством для всех блюд. """ all_prod = {} cook_book = reading_cook_book(FILE_NAME) for dish in dishes: ingredients = cook_book[dish] for ingredient in ingredients: if ingredient['ingredient_name'] in all_prod: all_prod[ingredient['ingredient_name']]['quantity'] += ingredient['quantity'] * person_count else: all_prod.update({ingredient['ingredient_name']: {'measure': ingredient['measure'], 'quantity': ingredient['quantity'] * person_count}}) return all_prod def file_count_lines(file_): count = 0 with open(file_, encoding='UTF-8') as f: while f.readline(): count += 1 return count def merge_and_save_files(files): with open(os.path.join(PATH_, OUTPUT_FILE_NAME), 'w', encoding='UTF-8') as fs: for file in files: with open(os.path.join(PATH_, file[1]), encoding='UTF-8') as fr: fs.write(f'{file[1]}\n{file[0]}\n') while line := fr.readline(): fs.write(line) fs.write('\n') return None # ===== TEST DATA BLOCK ====== print(f'Результат задачи 1: Словарь из блюд\n' f'===================================') pprint(reading_cook_book(FILE_NAME)) print() print(f'Результат задачи 2: Словарь из ингредиентов с их нужным количеством\n' f'===================================================================') pprint(get_shop_list_by_dishes(['Фахитос', 'Омлет'], 2)) # ТЕСТ: здесь повторяются помидоры print() print(f'Результат задачи 3: Объединение файлов\n' f'======================================') files_info = [(file_count_lines(os.path.join(PATH_, f)), f) for f in TEST_FILE_NAMES] merge_and_save_files(sorted(files_info)) with open(os.path.join(PATH_, OUTPUT_FILE_NAME), encoding='UTF-8') as f: while line := f.readline().removesuffix('\n'): print(line)