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?

Related of "analizar un archivo separado por tabulaciones en Python"

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 …