library/code.py

208 lines
7.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()