2011-09-20 14 views
6

Tengo un archivo de texto, de los cuales necesito cada columna, preferiblemente en un diccionario o una lista, el formato es:pitón archivo de texto de lectura

N  ID REMAIN  VERS   
2 2343333 bana   twelve  
3 3549287 moredp  twelve   
3 9383737 hinsila   twelve   
3 8272655 hinsila   eight   

que he intentado:

crs = open("file.txt", "r") 
for columns in (raw.strip().split() for raw in crs): 
    print columns[0] 

Resultado = 'Fuera de error de índice'

también probamos:

crs = csv.reader(open(file.txt", "r"), delimiter=',', quotechar='|', skipinitialspace=True) 
    for row in crs: 
        for columns in row: 
          print columns[3] 

que parece leer cada carbón como una columna, en lugar de cada 'palabra'

Me gustaría obtener las cuatro columnas, es decir:

2 
2343333 
bana 
twelve 

en los diccionarios separados o listas

Cualquier la ayuda es genial, gracias!

+0

Usted usar 'CRS = csv.reader (abierta (archivo.txt", "r"), delimitador = ' ' quotechar =' |', skipinitialspace = True) 'y tienen un archivo CSV con ** espacios ** como 'delimitador'?También imprima 'row [3]' si esta es la variable que obtiene en cada iteración, no 'columns [3]'. – eumiro

+0

si configuro el delimitador en "" produce el mismo resultado, solo estaba jugando con el "," para ver si puedo hacer un cambio – Kilizo

+0

Su primer bucle 'for' me funciona. Sin 'error de índice'. – senderle

Respuesta

8

Esto funciona muy bien para mí:

>>> crs = open("file.txt", "r") 
>>> for columns in (raw.strip().split() for raw in crs): 
...  print columns[0] 
... 
N 
2 
3 
3 
3 

Si desea convertir columnas a filas, utilice zip.

>>> crs = open("file.txt", "r") 
>>> rows = (row.strip().split() for row in crs) 
>>> zip(*rows) 
[('N', '2', '3', '3', '3'), 
('ID', '2343333', '3549287', '9383737', '8272655'), 
('REMAIN', 'bana', 'moredp', 'hinsila', 'hinsila'), 
('VERS', 'twelve', 'twelve', 'twelve', 'eight')] 

Si tiene líneas en blanco, fíltrelas antes de usar el código postal.

>>> crs = open("file.txt", "r") 
>>> rows = (row.strip().split() for row in crs) 
>>> zip(*(row for row in rows if row)) 
[('N', '2', '3', '3', '3'), ('ID', '2343333', '3549287', '9383737', '8272655'), ('REMAIN', 'bana', 'moredp', 'hinsila', 'hinsila'), ('VERS', 'twelve', 'twelve', 'twelve', 'eight')] 
+0

Gracias, me has hecho darme cuenta de que es la línea de espacio en blanco que está causando mi error de índice, creo, ¿cómo me libraría de la línea de espacio en blanco? – Kilizo

+0

@Kilizo, mira mi edición. – senderle

6
>>> with open("file.txt") as f: 
... c = csv.reader(f, delimiter=' ', skipinitialspace=True) 
... for line in c: 
...  print(line) 
... 
['N', 'ID', 'REMAIN', 'VERS', ''] #that '' is for leading space after columns. 
['2', '2343333', 'bana', 'twelve', ''] 
['3', '3549287', 'moredp', 'twelve', ''] 
['3', '9383737', 'hinsila', 'twelve', ''] 
['3', '8272655', 'hinsila', 'eight', ''] 

O, a la antigua usanza:

>>> with open("file.txt") as f: 
...  [line.split() for line in f] 
... 
[['N', 'ID', 'REMAIN', 'VERS'], 
['2', '2343333', 'bana', 'twelve'], 
['3', '3549287', 'moredp', 'twelve'], 
['3', '9383737', 'hinsila', 'twelve'], 
['3', '8272655', 'hinsila', 'eight']] 

Y para valores de columna que consiguen:

>>> l 
[['N', 'ID', 'REMAIN', 'VERS'], 
['2', '2343333', 'bana', 'twelve'], 
['3', '3549287', 'moredp', 'twelve'], 
['3', '9383737', 'hinsila', 'twelve'], 
['3', '8272655', 'hinsila', 'eight']] 
>>> {l[0][i]: [line[i] for line in l[1:]] for i in range(len(l[0]))} 
{'ID': ['2343333', '3549287', '9383737', '8272655'], 
'N': ['2', '3', '3', '3'], 
'REMAIN': ['bana', 'moredp', 'hinsila', 'hinsila'], 
'VERS': ['twelve', 'twelve', 'twelve', 'eight']} 
+0

entonces, ¿cómo leería cada valor en un diccionario o lista, por lo que toda la primera columna en una lista y toda la segunda columna en una lista. – Kilizo

+0

@Kilizo, respuesta editada, creo que esto es lo que quieres. – utdemir

0

se puede utilizar una lista por comprensión de esta manera:

with open("split.txt","r") as splitfile: 
    for columns in [line.split() for line in splitfile]: 
     print(columns) 

Luego lo tendrá en un 2d a rray lo que le permite agruparlo como quiera.

1
with open("path\sample1.csv") as f: 
    for line in f: 
     print line 

// leer archivo línea por línea

+1

esto no responde la pregunta ... también el código carece de sangría apropiada –

0

sólo tiene que utilizar una lista de listas

import csv 

columns = [[] for _ in range(4)] # 4 columns expected 

with open('path', rb) as f: 
    reader = csv.reader(f, delimiter=' ') 
    for row in reader: 
     for i, col in enumerate(row): 
      columns[i].append(col) 

o si el número de columnas necesita para crecer de forma dinámica:

import csv 

columns = [] 

with open('path', rb) as f: 
    reader = csv.reader(f, delimiter=' ') 
    for row in reader: 
     while len(row) > len(columns): 
      columns.append([]) 
     for i, col in enumerate(row): 
      columns[i].append(col) 

Al final, puede imprimir sus columnas wi th:

for i, col in enumerate(columns, 1): 
    print 'List{}: {{{}}}'.format(i, ','.join(col)) 
0

¿Qué le parece esto?

f = open("file.txt") 

for i in f: 
    k = i.split() 
    for j in k: 
     print j 
Cuestiones relacionadas