diff --git a/data/data.txt b/data/data.txt new file mode 100644 index 0000000..c067e0c --- /dev/null +++ b/data/data.txt @@ -0,0 +1,10 @@ +Alice|5|Отличный товар, очень доволен покупкой! +Bob|2|Качество плохое, разочарован полностью. +Carol|4|Хороший товар, но доставка медленная. +Dave|1|Ужасный опыт, больше не куплю. +Emma|5|Прекрасное качество и быстрая доставка! +Frank|3|Средний товар, ничего особенного. +Grace|4|Довольно хороший, рекомендую. +Henry|2|Не соответствует описанию. +Irene|5|Очень понравилось, супер! +Jack|1|Плохо, деньги на ветер. \ No newline at end of file diff --git a/reviews.py b/reviews.py index 753ba86..47d358a 100644 --- a/reviews.py +++ b/reviews.py @@ -1,32 +1,180 @@ +import os.path +import string + + def load_reviews(filepath: str) -> list: - return None + reviews = [] + if not os.path.exists(filepath): + print("Файл отзывов не найден!") + return reviews + with open(filepath, "r", encoding="utf-8") as file: + for line in file: + line = line.strip() + parts = line.split("|") + username, rating, text = parts + reviews.append({ + "username": username.strip(), + "rating": int(rating), + "text": text.strip() + }) + return reviews + def filter_by_rating(reviews: list, min_rating: int, max_rating: int) -> list: - return None + filtered_reviews = [] + for rev in reviews: + rating = rev["rating"] + if min_rating <= rating <= max_rating: + filtered_reviews.append(rev) + return filtered_reviews + def get_average_rating(reviews: list) -> float: - return None + if not reviews: + return 0.0 + + total = sum(rev["rating"] for rev in reviews) + avg = total / len(reviews) + return round(avg, 2) + def count_words_in_review(review: dict) -> int: - return None + text = review.get("text", "") + words = text.split() + return len(words) + def find_longest_review(reviews: list) -> dict: - return None + if not reviews: + return {} + + return max(reviews, key=count_words_in_review) + def build_word_frequency(reviews: list) -> dict: - return None + freq = {} + translator = str.maketrans("", "", string.punctuation) + + for review in reviews: + text = review["text"].lower() + text = text.translate(translator) + words = text.split() + + for word in words: + freq[word] = freq.get(word, 0) + 1 + + return freq + def get_top_words(freq_dict: dict, n: int) -> list: - return None + sorted_words = sorted( + freq_dict.items(), + key=lambda x: x[1], + reverse=True + ) + return sorted_words[:n] + def group_reviews_by_rating(reviews: list) -> dict: - return None + grouped = { + item: [] + for item in range(1, 6) + } + + for rev in reviews: + rating = rev["rating"] + grouped[rating].append(rev) + + return grouped + def format_summary(reviews: list, top_words: list, avg_rating: float) -> str: - return None + total_reviews = len(reviews) + usernames = sorted({ + rev["username"] + for rev in reviews + }) + + report_lines = [ + "=== Отчёт по отзывам ===", + "Общее количество отзывов: " + str(total_reviews), + "Средний рейтинг: " + str(avg_rating), + "", + "Топ слов:" + ] + + for word, count in top_words: + report_lines.append("- " + word + ": " + str(count)) + + report_lines.append("") + report_lines.append("Пользователи:") + + for user in usernames: + report_lines.append("- " + user) + + result = "\n".join(report_lines) + + return result + + +def save_report(report: str, output_path: str) -> None: + directory = os.path.dirname(output_path) + + if directory and not os.path.exists(directory): + os.makedirs(directory) + + with open(output_path, "w", encoding="utf-8") as file: + file.write(report) + def main(): + filepath = "data/data.txt" + + # Загрузка отзывов из файла + reviews = load_reviews(filepath) + print("Загружено отзывов:", len(reviews)) + + # Средний рейтинг + avg_rating = get_average_rating(reviews) + print("Средний рейтинг: " + str(avg_rating)) + + # Фильтрация по рейтингу + positive = filter_by_rating(reviews, 4, 5) + negative = filter_by_rating(reviews, 1, 2) + + print("\nПоложительных отзывов:", len(positive)) + print("Отрицательных отзывов:", len(negative)) + + # Самый длинный отзыв + longest = find_longest_review(reviews) + if longest: + print("\nСамый длинный отзыв:") + print(longest['username'] + ": " + longest['text']) + + # Топ-5 слов + freq = build_word_frequency(reviews) + top_words = get_top_words(freq, 5) + + print("\nТоп-5 слов:") + for word, count in top_words: + print(str(word) + ": " + str(count)) + + # Группировка + grouped = group_reviews_by_rating(reviews) + + print("\nКоличество отзывов по рейтингам:") + for rating in range(1, 6): + print(str(rating) + ": " + str(len(grouped[rating]))) + + # Отчёт + report = format_summary(reviews, top_words, avg_rating) + print("\n" + report) + + # Сохранение отчёта + save_report(report, "data/report.txt") + print("\nПрограмма завершена!") + if __name__ == '__main__': - main() \ No newline at end of file + main()