2012-02-06 8 views
10

Soy un novato con Python y busco cómo analizar un archivo .txt. Mi archivo .txt es una lista de nombres con informaciones de cálculo como:Parse pares de valores clave en un archivo de texto

miarchivo.txt

var0 = 16
var1 = 1.12434E10
var2 = -1.923E-3
var3 = 920

¿Cómo leer los valores y ponerlos en myvar0, myvar1, myvar2, myvar3 en python?

Respuesta

36

Sugiero almacenar los valores en un diccionario en lugar de en las variables locales separados:

myvars = {} 
with open("namelist.txt") as myfile: 
    for line in myfile: 
     name, var = line.partition("=")[::2] 
     myvars[name.strip()] = float(var) 

Ahora tiene acceso a ellos como myvars["var1"]. Si los nombres son los nombres de las variables pitón válida, puede poner esto a continuación:

names = type("Names", [object], myvars) 

y acceder a los valores como, por ejemplo, names.var1.

+0

En mi caso, el uso de strip() en el nombre era redundante, pero la nueva línea en var causaba un problema. Entonces, lo que funcionó mejor para mí fue myvars [name] = float (var.strip()) – snow6oy

+0

¿Qué sucede si el archivo cas comenta '# esto es una línea de comentarios' –

11

pitón Try módulo estándar configparser

+1

NOTA: ConfigParser lanza una 'MissingSectionHeaderError' si el archivo no contiene encabezados de sección y el ejemplo de OP hace no tiene encabezados La solución personalizada de @Lauritz es probablemente más simple que [posibles soluciones para usar configparser sin encabezados] (http://stackoverflow.com/questions/22501121/configparser-missingsectionheadererror-when-parsing-rsyncd-config-file-with -glob). – 7yl4r

1

Como @kev sugiere, el módulo configparser es el camino a seguir.

Sin embargo, en algunos escenarios (un poco feo, lo admito) pero muy simple y efectiva manera de hacer que esto es para cambiar el nombre de myfile.txt a myfile.py y hacer un from myfile import * (después de corregir el error tipográfico var 0 ->var0)

Sin embargo, esto es muy inseguro, por lo que si el archivo es de una fuente externa o puede ser escrito por un atacante malintencionado, use algo que valida los datos en lugar de ejecutarlos a ciegas.

0

Si hay varios valores separados por comas en una sola línea, aquí es código para analizar eso:

res = {}                                                

    pairs = args.split(", ")                                            
    for p in pairs:                                              
     var, val = p.split("=")                                           
     res[var] = val                                             
Cuestiones relacionadas