''' Programa ejemplo para cargar una matriz editada en un archivo de texto cuyo nombre se solicita al usuario en una lista de filas de números enteros
y grabar su traspuesta en otro archivo con nombre compuesto con el del archivo original y el posfijo _traspuesta.
En el archivo cada línea debe contener los elementos de una fila de la matriz separados por uno o más espacios.
El archivo de texto se puede editar con cualquier editor de texto de sistema operativo, como el notepad de Windows, en cuyo caso se puede guardar con
nombre matriz (el editor le agrega automáticamente la extensión .txt), y cuando se ingrese su nombre en el programa, debe incluirse la extensión .txt
(matriz.txt)

Ejemplo de contenido de matriz.txt:
 1    -3     2
-3     5     5
 2     4     0

Resultado en matriz_traspuesta.txt:
 1    -3     2
-3     5     4
 2     5     0

 '''

def carga(nombreArchivo):
    ''' Carga la matriz en una lista desde el archivo cuyo nombre en el almacenamiento masivo representa el argumento nombreArchivo '''
    # Prólogo
    arch = open(nombreArchivo, 'r')
    ''' establece una conexión para lectura entre la variable arch y el archivo cuyo nombre representa nombreArch, que debe existir en la misma carpeta
    donde está el programa '''

    matriz = [] # establecimiento de estado inicial de la lista para la matriz como una lista vacia

    # Desarrollo
    for línea in arch: # línea toma los valores de cada línea del archivo desde la primera hasta la última, como cadenas de caracteres
        fila = [int(elem) for elem in línea.split()] # línea.split() convierte línea en una lista de cadenas (elem) delimitadas por espacios
        # y se construye una lista con la conversión de cada cadena a punto flotante asignándosela a fila

        matriz.append(fila) # se agrega la lista fila al final de la lista matriz

    # Epílogo
    arch.close() # se cierra la conexión entre el archivo real que representa arch y esta variable
    return matriz # se devuelve matriz como resultado de la función

def grabaTraspuesta(m, nomArch):
    # Prólogo
    arch = open(nomArch, 'w')
    filas = len(m) # cantidad de filas de m
    columnas = len(m[0]) # cantidad de columnas de m (siempre tendrá una fila 0)

    # Desarrollo
    for c in range(columnas):
        for f in range(filas): arch.write(f'{m[f][c]:7d}')
        arch.write('\n') # salto de línea en arch

    # Epílogo
    arch.close()

# PROGRAMA
# Prólogo
print('Carga de una matriz desde un archivo de texto\n')
print('El archivo debe contener una fila de la matriz por línea, y no debe contener líneas vacias al final.\n')
na = input('Ingrese el nombre del archivo de texto, incluyendo su extensión .txt: ')
mat = carga(na)

# Desarrollo
comp_na = na.split('.') # se asigna a comp_na una lista con el nombre y la extensión de la cadena en na
nat = comp_na[0]+'_traspuesta.txt'
grabaTraspuesta(mat, nat)

# Epílogo
print(f'\nSe grabó la matriz traspuesta del archivo {na} en el archivo {nat}.\n')
input('Pulse Enter/Intro para terminar el programa')
