analizar un archivo separado por tabulaciones en Python

Estoy tratando de analizar un archivo separado por tabulaciones en Python, donde un número ubicado k tabulaciones aparte del comienzo de una fila, debe colocarse en la matriz k-th.

¿Existe una función incorporada para hacer esto, o una mejor manera, aparte de leer línea por línea y hacer todo el procesamiento obvio que una solución ingenua realizaría?

Puede usar el módulo csv para analizar fácilmente los archivos de valores separados por tabs.

 import csv with open("tab-separated-values") as tsv: for line in csv.reader(tsv, dialect="excel-tab"): #You can also use delimiter="\t" rather than giving a dialect. ... 

Donde line es una lista de los valores en la fila actual para cada iteración.

Edición: como se sugiere a continuación, si desea leer por columna, y no por fila, lo mejor que puede hacer es usar el componente zip() integrado:

 with open("tab-separated-values") as tsv: for column in zip(*[line for line in csv.reader(tsv, dialect="excel-tab")]): ... 

No creo que ninguna de las respuestas actuales realmente haga lo que dijiste que querías. (Corrección: ahora veo que @Gareth Latty / @Lattyware ha incorporado mi respuesta en su propia versión como “Edición” cerca del final.)

De todos modos, aquí está mi opinión:

Diga que estos son los valores separados por tabulaciones en su archivo de entrada:

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

luego esto:

 with open("tab-separated-values.txt") as inp: print( list(zip(*(line.strip().split('\t') for line in inp))) ) 

produciría lo siguiente:

 [('1', '6', '11', '16'), ('2', '7', '12', '17'), ('3', '8', '13', '18'), ('4', '9', '14', '19'), ('5', '10', '15', '20')] 

Como puede ver, coloca el elemento k-th de cada fila en la matriz k-th.

Me gusta esto:

 >>> s='1\t2\t3\t4\t5' >>> [x for x in s.split('\t')] ['1', '2', '3', '4', '5'] 

Para un archivo:

 # create test file: >>> with open('tabs.txt','w') as o: ... s='\n'.join(['\t'.join(map(str,range(i,i+10))) for i in [0,10,20,30]]) ... print >>o, s #read that file: >>> with open('tabs.txt','r') as f: ... LoL=[x.strip().split('\t') for x in f] ... >>> LoL [['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], ['10', '11', '12', '13', '14', '15', '16', '17', '18', '19'], ['20', '21', '22', '23', '24', '25', '26', '27', '28', '29'], ['30', '31', '32', '33', '34', '35', '36', '37', '38', '39']] >>> LoL[2][3] 23 

Si quieres que la entrada sea transpuesta:

 >>> with open('tabs.txt','r') as f: ... LoT=zip(*(line.strip().split('\t') for line in f)) ... >>> LoT[2][3] '32' 

O (mejor aún) use el módulo csv en la distribución predeterminada …