Загрузить файлы в «/»

This commit is contained in:
Никита Глушков 2026-04-02 17:20:11 +00:00
commit f2ca062eff
3 changed files with 211 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.venv/
.idea/

1
README.md Normal file
View File

@ -0,0 +1 @@
#Библиотечная аналитика (Практика 2, Задание 1)

208
code.py Normal file
View 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()