2012-02-06 17 views
10

Sono un principiante con Python e cerco come analizzare un file .txt. Il mio file .txt è un elenco nomi con informazioni di calcolo come:Parse coppie di valori chiave in un file di testo

miofile.txt

Var0 = 16
var1 = 1.12434E10
var2 = -1.923E-3
VAR3 = 920

Come leggere i valori e inserirli in python in myvar0, myvar1, myvar2, myvar3?

risposta

36

Suggerisco di memorizzazione dei valori in un dizionario anziché in variabili locali separati:

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

Ora accedervi come myvars["var1"]. Se i nomi sono tutti nomi di variabili python validi, puoi inserire quanto segue:

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

e accedere ai valori come ad es. names.var1.

+0

Nel mio caso l'uso di strip() sul nome era ridondante, ma la nuova riga su var ha causato un problema. Quindi ciò che ha funzionato meglio per me è stato myvars [nome] = float (var.strip()) – snow6oy

+0

cosa succede se il file cas commenta '# questa è una riga di commento' –

11

Prova pitone modulo standard configparser

+1

NOTA: ConfigParser getta un 'MissingSectionHeaderError' se il file non contiene intestazioni di sezione e l'esempio di OP fa non avere intestazioni La soluzione personalizzata di @Lauritz è probabilmente più semplice di [possibili soluzioni per l'utilizzo di configparser senza intestazioni] (http://stackoverflow.com/questions/22501121/configparser-missingsectionheadererror-when-parsing-rsyncd-config-file-with -glob). – 7yl4r

1

Come suggerisce @kev, il modulo configparser è la strada da percorrere.

Tuttavia, in alcuni scenari (un po 'brutto, lo ammetto), ma molto semplice ed efficace modo di fare per questo è per rinominare myfile.txt-myfile.py e fare un from myfile import * (dopo di correggere l'errore di battitura var 0 ->var0)

Tuttavia, questo è molto insicuro, quindi se il file proviene da un'origine esterna o può essere scritto da un malintenzionato, utilizzare qualcosa di che convalida i dati anziché eseguirli alla cieca.

0

Se ci sono più valori separati da virgole su una singola linea, ecco il codice per analizzare quello fuori:

res = {}                                                

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