diff --git a/README.md b/README.md new file mode 100644 index 0000000..536dec5 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Анализ рейтингов фильмов \ No newline at end of file diff --git a/data/movies.txt b/data/movies.txt index e69de29..da5c33a 100644 --- a/data/movies.txt +++ b/data/movies.txt @@ -0,0 +1,21 @@ +The Shawshank Redemption;1994;9.3;Drama;2500000 +The Godfather;1972;9.2;Crime;1800000 +The Dark Knight;2008;9.0;Action;2400000 +Pulp Fiction;1994;8.9;Crime;1900000 +Schindler's List;1993;8.9;Drama;1300000 +Inception;2010;8.8;Sci-Fi;2200000 +Fight Club;1999;8.8;Drama;2000000 +Forrest Gump;1994;8.8;Drama;1900000 +The Matrix;1999;8.7;Sci-Fi;1800000 +Interstellar;2014;8.6;Sci-Fi;1700000 +The Lord of the Rings: The Return of the King;2003;8.9;Fantasy;1800000 +Star Wars: Episode V - The Empire Strikes Back;1980;8.7;Sci-Fi;1600000 +The Silence of the Lambs;1991;8.6;Thriller;1400000 +Se7en;1995;8.6;Thriller;1500000 +The Green Mile;1999;8.6;Drama;1300000 +Blade Runner;1982;8.1;Sci-Fi;900000 +Alien;1979;8.2;Sci-Fi;850000 +The Terminator;1984;8.1;Sci-Fi;950000 +Back to the Future;1985;8.5;Sci-Fi;1200000 +2001: A Space Odyssey;1968;8.3;Sci-Fi;750000 +The Martian;2015;8.0;Sci-Fi;1050000 \ No newline at end of file diff --git a/src/main.py b/src/main.py index d3af957..e2404b2 100644 --- a/src/main.py +++ b/src/main.py @@ -1,74 +1,151 @@ +#Система анализа рейтингов фильмов. -# . - +import os def parse_movie_line(line: str) -> dict: - return + #Принимает строку формата "название;год;рейтинг;жанр;число_голосов". + + + parts = line.strip().split(';') + if len(parts) != 5: + raise ValueError(f"Неверный формат строки: '{line}'") + title, year_str, rating_str, genre, votes_str = parts + return { + 'title': title.strip(), + 'year': int(year_str.strip()), + 'rating': float(rating_str.strip()), + 'genre': genre.strip(), + 'votes': int(votes_str.strip()) + } def load_movies_from_file(filename: str) -> list[dict]: - - return + + #Читает файл, пропускает пустые строки. + + movies = [] + try: + with open(filename, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line: + movies.append(parse_movie_line(line)) + except FileNotFoundError: + print(f"Ошибка: файл '{filename}' не найден.") + except Exception as e: + print(f"Ошибка при чтении файла: {e}") + return movies def filter_movies_by_genre(movies: list[dict], genre: str) -> list[dict]: - - return + #Фильтрация по жанру + return [m for m in movies if m['genre'].lower() == genre.lower()] def calculate_average_rating(movies: list[dict]) -> float: - - return + #Средний рейтинг списка фильмов. Если список пуст, возвращает 0.0. + if not movies: + return 0.0 + total = sum(m['rating'] for m in movies) + return total / len(movies) def get_top_n_movies(movies: list[dict], n: int) -> list[dict]: - return + #Возвращает n лучших фильмов: сортировка по рейтингу (убыв.), + #при равных рейтингах — по убыванию числа голосов. + + sorted_movies = sorted( + movies, + key=lambda m: (m['rating'], m['votes']), + reverse=True + ) + return sorted_movies[:n] def get_movie_titles(movies: list[dict]) -> list[str]: - - return + #Извлекает названия фильмов. + return [m['title'] for m in movies] def count_movies_by_year(movies: list[dict]) -> dict[int, int]: - - return + #Подсчёт количества фильмов по годам. + counts = {} + for m in movies: + year = m['year'] + counts[year] = counts.get(year, 0) + 1 + return dict(sorted(counts.items())) def find_most_voted_movie(movies: list[dict]) -> dict: - - return + #Фильм с максимальным числом голосов. При пустом списке — пустой словарь. + if not movies: + return {} + return max(movies, key=lambda m: m['votes']) def genre_distribution(movies: list[dict]) -> dict[str, int]: - - return + #Распределение фильмов по жанрам. + dist = {} + for m in movies: + genre = m['genre'] + dist[genre] = dist.get(genre, 0) + 1 + return dict(sorted(dist.items())) -def save_movie_report(movies: list[dict]) -> str: - - return +def save_movie_report(movies: list[dict], filename: str) -> None: + #Сохраняет текстовый отчёт о фильмах в файл. + try: + directory = os.path.dirname(filename) + if directory and not os.path.exists(directory): + os.makedirs(directory) + + with open(filename, 'w', encoding='utf-8') as f: + if not movies: + f.write("Нет данных\n") + return + for m in movies: + line = f"{m['title']} ({m['year']}) — Рейтинг: {m['rating']}, Жанр: {m['genre']}\n" + f.write(line) + except Exception as e: + print(f"Ошибка при сохранении файла '{filename}': {e}") def main(): - # + #Загрузка и обработка данных movies = load_movies_from_file("data/movies.txt") - - # Sci-Fi + if not movies: + print("Нет данных для анализа.") + return + + #Фильтрация по жанру Sci-Fi scifi_movies = filter_movies_by_genre(movies, "Sci-Fi") - - # Sci-Fi + + #Средний рейтинг Sci-Fi avg_scifi = calculate_average_rating(scifi_movies) - - #-5 Sci-Fi + print(f"Средний рейтинг Sci-Fi фильмов: {avg_scifi:.2f}") + + #Топ-5 Sci-Fi фильмов top_scifi = get_top_n_movies(scifi_movies, 5) - - # -5 + + #Сохранинения топ-5 фильмов в файл save_movie_report(top_scifi, "result/top5_scifi.txt") - - # 5 + print("Топ-5 Sci‑Fi сохранён в result/top5_scifi.txt") + + #Самый популярный фильм по числу голосов titles_top = get_movie_titles(top_scifi) - - # + print("\nНазвания топ-5 Sci-Fi фильмов:") + for title in titles_top: + print(f"- {title}") + + #Самый популярный фильм по числу голосов most_voted = find_most_voted_movie(movies) - - # + if most_voted: + print(f"\nСамый популярный фильм (по числу голосов): " + f"{most_voted['title']} ({most_voted['year']})") + + #Распределение по годам year_counts = count_movies_by_year(movies) - - # + print("\nРаспределение фильмов по годам:") + for year, count in year_counts.items(): + print(f"{year}: {count}") + + #Распределение по жанрам genre_dist = genre_distribution(movies) + print("\nРаспределение по жанрам:") + for genre, count in genre_dist.items(): + print(f"{genre}: {count}") if __name__ == "__main__": main() \ No newline at end of file