2012-04-12 21 views
5

Estoy usando python con numpy para leer los datos de un modelo numérico en un archivo de texto con un formato bastante complicado.Python: leer archivos de texto complicados con numpy

Las funciones genfromtxt y fromfile de Numpy funcionan bien, pero solo si los datos están estructurados. Mis archivos de datos se ve algo como esto:

------ SNIP

[sitename] [dimemsion 1 size] [dimension 2 size] 
[data for dim 1] 
[data for dim 2] 
[date/time] 
[header data] 
[data (dim1 * dim2)] 
[header] 
[data] 
... 
. 
. 
[data/time] 
[header] 
[data] 
. 
. 
etc... 

---- SNIP

lo tanto, tengo una mezcla de texto y números y una complicada (pero repitiendo) diseño. ¿Cuál es la mejor manera de leer esto al usar numpy?

Saludos,

Chris

+1

¿Necesita usar 'numpy 'solo métodos? Quizás la parte de lectura podría hacerse en python simple. –

Respuesta

5

Numpy no es bueno en el análisis sintáctico generalizado, por lo que haría bien en mirar más allá de ella, y lo que usted elija dependerá principalmente de la consistencia de los archivos son.

Si son inusualmente ultracompatibles, por ejemplo, puede extraer números de posiciones conocidas y filas conocidas, de lo que puede leer en el archivo línea por línea como una picadura e indexar esto al personaje que usted querer. (Paso a través del archivo, por ejemplo, usando file.readlines para obtener cada línea como una cadena.)

El caso habitual (al menos eso me parece) es que es más variado que el anterior, pero que las operaciones de cadena simples pueden ser usado para analizar la línea, como string.split (que casi siempre es mi primer paso), etc.

Además de esto, hay muchas bibliotecas de análisis en Python. Soy parcial a pyparsing (pero no conozco bien a los otros, así que no es una comparación justa). Aquí está a summary of the various parsing libraries.

+0

+1 para pyparsing. Esta es absolutamente la herramienta correcta para el trabajo aquí. –

+0

Gracias - Daré una oportunidad a pyparsing. Como está basado en Python (en lugar de un módulo c como numpy.fromfile), ¿supongo que será notablemente más lento que usar numpy? Chris – ccbunney

+0

Sí, pyparsing es significativamente más lento que numpy.fromfile, al menos según mi experiencia. Creo que también está haciendo mucho más también. Además, aunque es una buena biblioteca, requiere algo de aprendizaje. Por esta razón, recomiendo primero intentarlo con las operaciones de cadena básicas, ya que generalmente funcionan, y si no funcionan, vaya a pyparsing (a menos que, por supuesto, le gustaría aprender a pyparsing de todos modos) – tom10

1

Acepto la respuesta anterior. La siguiente cadena de pasos funcionan mejor y son mucho más fácil que pyparsing o numpy.genfromtxt

inp = open(textfilename).readlines() 
my_list = [] 
for line in inp: 
    item = str.split(line) 
    my_list.append(float(item[0])) 

A continuación, puede convertir fácilmente la lista en una matriz/matriz numpy y proceder desde allí