Contando eficientemente el número de columnas del archivo de texto

Tengo un montón de archivos de texto delimitados por tabuladores grandes, con un formato similar a:

a 0.0694892 0 0.0118814 0 -0.0275522 b 0.0227414 -0.0608639 0.0811518 -0.15216 0.111584 c 0 0.0146492 -0.103492 0.0827939 0.00631915 

Para contar el número de columnas que siempre he usado:

 >>> import numpy as np >>> np.loadtxt('file.txt', dtype='str').shape[1] 6 

Sin embargo, este método obviamente no es eficiente para archivos más grandes, ya que todo el contenido del archivo se carga en la matriz antes de obtener la shape . ¿Existe un método simple, que sea más eficiente?

Si desea asegurarse de estar usando el mismo formato exacto que NumPy, la solución más simple es darle un envoltorio alrededor de la primera línea.

Si mira los documentos para loadtxt , el parámetro fname puede ser:

Archivo, nombre de archivo o generador para leer.

De hecho, ni siquiera tiene que ser un generador; cualquier iterable funciona bien. Como, digamos, una lista. Asi que:

  with open('file.txt', 'rb') as f: lines = [f.readline()] np.loadtxt(lines, dtype='str').shape[1] 

En otras palabras, simplemente leemos la primera línea, la pegamos en una lista de un elemento, la pasamos a loadtxt y la loadtxt como si fuera un archivo de una línea.

No necesitas adormecer para esto; solo lea una línea, divídala en tabs y encuentre la longitud de la lista:

 with open('file.txt', 'rb') as f: line = next(f) # read 1 line n = len(line.split('\t')) 

Si luego desea cargar la matriz completa, puede hacerlo con:

 f.seek(0) arr = np.loadtxt(f)