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