Python – lee los números del archivo de texto y los pone en la lista

Así que, como dice el título, estoy empezando a aprender algo de python y tengo problemas para aprender esta técnica. Lo que necesito lograr es leer algunos números y almacenarlos en una lista. El archivo de texto se parece a lo siguiente:

0 0 3 50 50 100 4 20 

Básicamente, se trata de coordenadas y direcciones que deben usarse para que las tortugas de python puedan hacer formas. Tengo esa parte abajo, el único problema es conseguirlos en un formato correcto. Entonces, lo que no puedo averiguar es cómo obtener esos números del archivo en [ [0, 0, 3, 50], [50, 100, 4, 20] ] una lista, con cada una de las cuatro coordenadas como una lista en esa lista. una gran lista

Aquí está mi bash, pero como dije, necesito ayuda, gracias.

 polyShape=[] infile = open(name,"r") num = int(infile.readline(2)) while num != "": polyShape.append(num) num = int(infile.readline(2)) infile.close() 

 with open('data.txt') as f: polyShape = [] for line in f: line = line.split() # to deal with blank if line: # lines (ie skip them) line = [int(i) for i in line] polyShape.append(line) 

Te regalaré

 [[0, 0, 3, 50], [50, 100, 4, 20]] 

Esto funcionará con un archivo que contiene líneas en blanco (o no).

El uso de la construcción with cerrará el archivo automáticamente cuando haya terminado, o se detectará una excepción.

Suponiendo que en realidad no hay una línea en blanco en su archivo de entrada:

 with open(name, "r") as infile: polyShape = [map(int, line.split()) for line in infile] 

Explicación: map(int, line.split()) divide cada line y convierte cada parte en un int . La construcción [X for Y in Z] es una comprensión de lista que a su vez mapea el map en todas las líneas del archivo y devuelve sus resultados en una lista.

Si esto le parece demasiado complicado por ahora, entonces el map(int, line.split()) es el mensaje principal para llevar a casa.

 with open('data.txt') as f: lis=[map(int,x.split()) for x in f if x.strip()] # if x.strip() to skip blank lines #use list(map(int,x.split())) in case of python 3.x 

Así es como funciona map() :

 >>> map(int,'1 2 3 4'.split()) [1, 2, 3, 4] 

Un trazador de líneas:

 [ [int(x) for x in line.split(' ')] for line in open(name,'r').readlines() if line.strip()] 

pero la parte readlines probablemente no es una gran idea.

Estoy bastante seguro de que [int(x) for x in ... ] es más rápido que usar map como en otras soluciones sugeridas.

Editar

Gracias a Blender: no hay necesidad de .readlines , lo cual es genial, así que solo tenemos:

 [ map(int, line.split()) for line in open(name,'r') if line.strip()] 

También utilicé map(int, ) porque en realidad es más rápido, y también puedes usar solo line.split() lugar de line.split(' ') .

Iterar sobre el archivo sería la forma más fácil:

 poly_shape = [] with open(name, 'r') as handle: for line in handle: if not line.strip(): continue # This skips blank lines values = map(int, line.split()) poly_shape.append(values) 

No recomiendo usar el append para una gran variedad. Es 50 veces más lento que crear una matriz de cero y asignarle valores.

 import numpy fname = "D:\Test.txt"; num_lines = sum(1 for line in open(fname)); array = numpy.zeros((num_lines,4)); k = 0; with open(fname, "r") as ins: for line in ins: a =[int(i) for i in line.split(' ')];; array[k,0:4] =a; k = k+1; print(array)