¿Cómo leer una matriz de un archivo dado?

Tengo un archivo de texto que contiene matriz de N * M dimensiones.

Por ejemplo, el archivo input.txt contiene lo siguiente:

0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0 0,0,2,1,0,2,0,0,0,0 0,0,2,1,1,2,2,0,0,1 0,0,1,2,2,1,1,0,0,2 1,0,1,1,1,2,1,0,2,1 

Necesito escribir un script de Python en el que pueda importar la matriz.

Mi script de python actual es:

 f = open ( 'input.txt' , 'r') l = [] l = [ line.split() for line in f] print l 

la lista de salida viene así

 [['0,0,0,0,0,0,0,0,0,0'], ['0,0,0,0,0,0,0,0,0,0'], ['0,0,0,0,0,0,0,0,0,0'], ['0,0,0,0,0,0,0,0,0,0'], ['0,0,0,0,0,0,0,0,0,0'], ['0,0,0,0,0,0,0,0,0,0'], ['0,0,2,1,0,2,0,0,0,0'], ['0,0,2,1,1,2,2,0,0,1'], ['0,0,1,2,2,1,1,0,0,2'], ['1,0,1,1,1,2,1,0,2,1']] 

Necesito recuperar los valores en forma int. Si bash escribir cast, arroja errores.

Considerar

 with open('input.txt', 'r') as f: l = [[int(num) for num in line.split(',')] for line in f] print(l) 

produce

 [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 1, 0, 2, 0, 0, 0, 0], [0, 0, 2, 1, 1, 2, 2, 0, 0, 1], [0, 0, 1, 2, 2, 1, 1, 0, 0, 2], [1, 0, 1, 1, 1, 2, 1, 0, 2, 1]] 

Tenga en cuenta que hay que dividir en comas.


Si tiene líneas en blanco entonces cambie

 l = [[int(num) for num in line.split(',')] for line in f ] 

a

 l = [[int(num) for num in line.split(',')] for line in f if line.strip() != "" ] 

Simplemente puede utilizar numpy.loadtxt . Fácil de usar, y también puede especificar su delimitador, tipos de datos, etc.

específicamente, todo lo que necesitas hacer es esto:

 import numpy as np input = np.loadtxt("input.txt", dtype='i', delimiter=',') print(input) 

Y la salida sería:

 [[0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 2 1 0 2 0 0 0 0] [0 0 2 1 1 2 2 0 0 1] [0 0 1 2 2 1 1 0 0 2] [1 0 1 1 1 2 1 0 2 1]] 

Lo siguiente hace lo que quieres:

 l = [] with open('input.txt', 'r') as f: for line in f: line = line.strip() if len(line) > 0: l.append(map(int, line.split(','))) print l 

Puedes hacerlo:

 fin = open('input.txt','r') a=[] for line in fin.readlines(): a.append( [ int (x) for x in line.split(',') ] ) 

No debe escribir su analizador csv, considere el módulo csv cuando lea tales archivos y use la instrucción with para cerrar después de leer:

 import csv with open('input.txt') ad f: data = [map(int, row) for row in csv.reader(f)] 

Echa un vistazo a este pequeño código de una línea para la matriz de lectura,

 matrix = [[input() for x in range(3)] for y in range(3)] 

Este código leerá la matriz de orden 3 * 3.

 import numpy as np f = open ( 'input.txt' , 'r') l = [] l = np.array([ line.split() for line in f]) print (l) type(l) 

salida:

 [['0'] ['0'] ['0'] ['0,0,0,0,0,0,0,0,0,0,0'] ['0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'] ['0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0']] 

numpy.ndarray