Текущий результат:

Код:
импортировать строку класс TextAnalyzer: def __init__(self, текст): self._text = текст self._processed_text = "" self._letter_frequency = {} защита выполнить_анализ (сам): self._preprocess_text() self._calculate_frequency() self._generate_report() защита _preprocess_text(сам): # Преобразуем текст в нижний регистр обработанный_текст = self._text.lower() # Удаление знаков препинания и специальных символов обработанный_текст = обработанный_текст.translate(str.maketrans("", "", string.punctuation)) # Удалить цифры обработанный_текст = обработанный_текст.translate(str.maketrans("", "", "0123456789")) # Убираем лишние пробелы обработанный_текст = " ".join(processed_text.split()) # Установите обработанный_текст в качестве переменной экземпляра self._processed_text = обработанный_текст #return обработанный_текст защита _calculate_frequency(self): # Рассчитать частоту букв для символа в self._processed_text: if char.isalpha(): # Проверяем, является ли символ буквой self._letter_frequency[char] = self._letter_frequency.get(char, 0) + 1 # если символ в Letter_frequency: # Letter_frequency[символ] += 1 # еще: # Letter_frequency[char] = 1 # возврат Letter_frequency защита _generate_report(self): total_letters = sum(self._letter_frequency.values()) # Рассчитать частоту букв в процентах частоты_процент = { Letter: (self._letter_frequency.get(letter, 0) / total_letters) * 100 для буквы в "abcdefghijklmnopqrstuvwxyz" } #Находим максимальное количество звездочек для масштабирования max_asterisks = max(int(percentage) для буквы, процент в частотах_percentage.items()) # Печать форматированного вывода с 2D-представлением # для i в диапазоне (max_asterisks, 0, -1): # строка = "" # для буквы в "abcdefghijklmnopqrstuvwxyz": # процент = частоты_процента.get(буква, 0) # количество звездочек = 0 # если процент > 0 и процент < 4: # количество звездочек = 1 # Процент elif >= 4 и процент < 8: # количество звездочек = 2 # процент элиф >= 8: # количество звездочек = 3 # if asterisks_count >= i: # строка += '*' # еще: # строка += '' # строка += f" | {letter.upper()}" # печать(строка) # Распечатать 5 лучших частот print("\nТоп-5 частот:") для буквы процент в сортировке (frequency_percentage.items(), key=lambda x: x[1],verse=True)[:5]: print(f"{letter.upper()}: {percentage:.2f}%") для i в диапазоне (max_asterisks, 0, -1): #print(" " * 34, end="") для письма в «abcdefghijklmnopqrstuvwxyz»: процент = частоты_процента.get(буква, 0) звездочек_count = 0 если процент > 0 и процент < 4: звездочек_count = 1 Процент elif >= 4 и процент = 8: звездочек_count = 3 если asterisks_count >= i: печать('*', конец=" ") еще: печать(' ', конец=" ") Распечатать() # Печать горизонтального разделителя печать("_" * 75) # Распечатать 2D-представление со звездочками поверх букв #print(" " * 34, end="") для письма в «abcdefghijklmnopqrstuvwxyz»: print(letter.upper(), end=" ") Распечатать() попыток = 0 пока попыток < 3: input_file_name = input("Пожалуйста, введите файл, который вы хотите проанализировать: ") если input_file_name.endswith('.txt') и os.path.exists(input_file_name): input_text = Caesar.openFile(имя_входного_файла) если input_text равен None: print("Ошибка: невозможно прочитать файл.") попытки += 1 еще: перерыв еще: print("Неверное имя файла или файл не существует. Пожалуйста, включите расширение «.txt».) попытки += 1 еще: print("Не удалось прочитать файл после 3 попыток. Возврат в главное меню.") continue # Переход к следующей итерации цикла главного меню анализатор = TextAnalyzer(input_text) печать(анализатор) анализатор.perform_anaанализ() Это мой предполагаемый результат:

Мне удалось распечатать левую часть экрана, но когда я пытаюсь распечатать правую часть, у меня появляется такая ошибка:

Файл представляет собой сохраненный блокнот txt с содержимым:
"Мерцай, мерцай звездочка, Как я же потрясен тем, кто ты есть. Над небом так высоко, как алмаз в небе." У меня нет проблем с астериками, но я очень сильно ломал голову над тем, как получить правильный размер вывода на экран, поскольку я использую цикл for для его генерации.