From f2ca062efffe6eea931b0b27d4634c881ba591bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=93=D0=BB=D1=83?= =?UTF-8?q?=D1=88=D0=BA=D0=BE=D0=B2?= Date: Thu, 2 Apr 2026 17:20:11 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?/=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + README.md | 1 + code.py | 208 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 code.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..05de0db --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.venv/ +.idea/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e630a50 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +#Библиотечная аналитика (Практика 2, Задание 1) \ No newline at end of file diff --git a/code.py b/code.py new file mode 100644 index 0000000..ff6f648 --- /dev/null +++ b/code.py @@ -0,0 +1,208 @@ +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() \ No newline at end of file