Загрузка данных
import numpy as np
def read_matrix(filename):
"""Чтение матрицы из файла и преобразование в числовой массив."""
print("Чтение матрицы из файла...")
with open(filename, "r", encoding="utf-8") as file:
lines = [line.strip() for line in file if line.strip()]
if not lines:
raise ValueError("Файл пустой!")
# Определяем разделитель: запятая, табуляция или пробел
if "," in lines[0]:
separator = ","
elif "\t" in lines[0]:
separator = "\t"
else:
separator = None # Пробелы или несколько пробелов
rows = []
for line in lines:
if separator is None:
values = line.split()
else:
values = [value.strip() for value in line.split(separator)]
if not values or any(value == "" for value in values):
raise ValueError("Обнаружены пустые элементы матрицы.")
rows.append([float(value) for value in values])
# Проверяем, что матрица прямоугольная
if any(len(row) != len(rows[0]) for row in rows):
raise ValueError(
"Строки имеют разное количество элементов!"
)
print("Конвертация в числовой массив...")
return np.array(rows, dtype=float), separator
def print_matrix(matrix, title):
"""Красивый вывод матрицы на экран."""
print(f"\n{title}:")
print("-" * 40)
for row in matrix:
print(" ".join(f"{value:g}" for value in row))
print("-" * 40)
def process_matrix(matrix, operation):
"""Выполнение выбранной операции над матрицей."""
if operation == 1:
# Транспонирование матрицы
return matrix.T
elif operation == 2:
# Поворот матрицы на 90 градусов по часовой стрелке
return np.rot90(matrix, k=-1)
else:
raise ValueError("Неизвестный номер операции!")
def write_matrix(filename, matrix, separator):
"""Запись результата в текстовый файл."""
# Для пробелов используем один пробел
output_separator = " " if separator is None else separator
np.savetxt(
filename,
matrix,
fmt="%g",
delimiter=output_separator
)
def main():
input_file = "input.txt"
output_file = "output.txt"
try:
# Чтение исходной матрицы
matrix, separator = read_matrix(input_file)
print_matrix(matrix, "Исходная матрица")
# Меню выбора операции
print("\nВыберите операцию:")
print("1. Транспонирование матрицы")
print("2. Поворот на 90 градусов по часовой стрелке")
operation = int(input("Введите номер операции (1 или 2): "))
if operation not in (1, 2):
raise ValueError("Введите 1 или 2.")
# Обработка матрицы
result_matrix = process_matrix(matrix, operation)
operation_name = (
"Транспонированная матрица"
if operation == 1
else "Матрица после поворота на 90 градусов"
)
# Вывод результата
print_matrix(result_matrix, operation_name)
# Сохранение результата в файл
print(f"\nЗапись результата в файл '{output_file}'...")
write_matrix(output_file, result_matrix, separator)
print("Операция завершена успешно!")
except FileNotFoundError:
print(f"Ошибка: файл '{input_file}' не найден.")
except ValueError as error:
print(f"Ошибка формата данных или ввода: {error}")
except PermissionError:
print("Ошибка: недостаточно прав для чтения или записи файла.")
except Exception as error:
print(f"Непредвиденная ошибка: {error}")
if __name__ == "__main__":
main()