Загрузка данных



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()