import os def load_books(file_path): """Загружает книги из файла в список словарей.""" books = [] try: with open(file_path, 'r', encoding='utf-8') as file: for line in file: line = line.strip() if not line: continue parts = line.split(',') if len(parts) == 6: book = { 'title': parts[0].strip(), 'author': parts[1].strip(), 'year': int(parts[2].strip()), 'genre': parts[3].strip(), 'rating': int(parts[4].strip()), 'pages': int(parts[5].strip()) } books.append(book) except FileNotFoundError: print(f"Файл {file_path} не найден.") except Exception as e: print(f"Ошибка при чтении: {e}") return books def filter_by_genre(books, genre): """Возвращает список книг указанного жанра.""" result = [] for book in books: if book['genre'].lower() == genre.lower(): result.append(book) return result def get_books_by_author(books, author): """Возвращает список книг указанного автора.""" result = [] for book in books: if book['author'].lower() == author.lower(): result.append(book) return result def calculate_average_rating(books): """Вычисляет средний рейтинг книг.""" if not books: return 0.0 total = 0 for book in books: total += book['rating'] average = total / len(books) return round(average, 2) def get_longest_book(books): """Находит книгу с наибольшим количеством страниц.""" if not books: return None longest = books[0] for book in books: if book['pages'] > longest['pages']: longest = book return longest def count_books_by_decade(books): """Подсчитывает количество книг по десятилетиям издания.""" decades = {} for book in books: decade = (book['year'] // 10) * 10 if decade in decades: decades[decade] += 1 else: decades[decade] = 1 return decades def get_top_rated_books(books, n): """Возвращает топ-N книг с самым высоким рейтингом.""" if not books: return [] sorted_books = sorted(books, key=lambda b: b['rating'], reverse=True) result = [] for i in range(min(n, len(sorted_books))): result.append(sorted_books[i]) return result def find_books_by_title_keyword(books, keyword): """Ищет книги, в названии которых есть ключевое слово.""" result = [] keyword_lower = keyword.lower() for book in books: if keyword_lower in book['title'].lower(): result.append(book) return result def generate_genre_report(books): """Генерирует отчёт: по каждому жанру — количество книг и средний рейтинг.""" temp = {} for book in books: genre = book['genre'] if genre not in temp: temp[genre] = {'count': 0, 'total_rating': 0} temp[genre]['count'] += 1 temp[genre]['total_rating'] += book['rating'] report = {} for genre, data in temp.items(): avg = data['total_rating'] / data['count'] report[genre] = { 'count': data['count'], 'avg_rating': round(avg, 2) } return report def save_statistics(stats, file_path): """Сохраняет статистику в текстовый файл.""" try: folder = os.path.dirname(file_path) if folder: os.makedirs(folder, exist_ok=True) with open(file_path, 'w', encoding='utf-8') as file: file.write("ОТЧЕТ ПО БИБЛИОТЕКЕ\n") file.write("=" * 40 + "\n\n") for genre, data in stats.items(): file.write(f"{genre}:\n") file.write(f" Книг: {data['count']}\n") file.write(f" Средний рейтинг: {data['avg_rating']}\n\n") file.write("=" * 40 + "\n") file.write("Конец отчета\n") print(f"Отчет сохранен: {file_path}") except Exception as e: print(f"Ошибка при сохранении: {e}") def main(): """Главная функция.""" print("Система управления библиотекой") print("-" * 40) # Загружаем данные books = load_books('data/books.txt') if not books: print("Нет данных для работы.") return print(f"Загружено книг: {len(books)}") # 1. Генерируем и сохраняем отчёт по жанрам genre_report = generate_genre_report(books) save_statistics(genre_report, 'reports/library_report.txt') # 2. Самая длинная книга longest = get_longest_book(books) if longest: print(f"Самая длинная книга: \"{longest['title']}\" — {longest['pages']} стр.") # 3. Топ-3 по рейтингу print("\nТоп-3 книги по рейтингу:") top_books = get_top_rated_books(books, 3) for i, book in enumerate(top_books, 1): print(f" {i}. \"{book['title']}\" — рейтинг {book['rating']}") # 4. Поиск по ключевому слову keyword = input("\nВведите слово для поиска в названии: ").strip() if keyword: found = find_books_by_title_keyword(books, keyword) if found: print(f"Найдено книг: {len(found)}") for book in found[:5]: print(f" - \"{book['title']}\" — {book['author']}") if len(found) > 5: print(f" ... и ещё {len(found) - 5}") else: print("Ничего не найдено.") # 5. Статистика по десятилетиям print("\nКниги по десятилетиям:") decades = count_books_by_decade(books) for decade in sorted(decades.keys()): print(f" {decade}-е годы: {decades[decade]} книг") # 6. Дополнительная демонстрация функций print("\nДополнительно:") avg = calculate_average_rating(books) print(f" Средний рейтинг всех книг: {avg}/5") fantasy = filter_by_genre(books, "Фэнтези") print(f" Книг в жанре 'Фэнтези': {len(fantasy)}") tolstoy = get_books_by_author(books, "Лев Толстой") print(f" Книг автора 'Лев Толстой': {len(tolstoy)}") print("\nПрограмма завершена.") if __name__ == "__main__": main()