Загрузить файлы в «/»
This commit is contained in:
commit
f2ca062eff
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
.venv/
|
||||
.idea/
|
||||
208
code.py
Normal file
208
code.py
Normal file
@ -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()
|
||||
Loading…
Reference in New Issue
Block a user