best way to read a configuration file
Paul McGuire
bogus at bogus.net
Wed Mar 3 06:35:25 EST 2004
"Karthikesh Raju" <karthik at james.hut.fi> wrote in message
news:2dy8qimiwq.fsf at itl-pc87.hut.fi...
>
> Hi All,
>
> i am wondering about the best way to read in a configuration file that
> goes like:
>
> ###########
>
> [users]
> source_dir = '/home/karthik/Projects/python'
> data_dir = '/home/karthik/Projects/data'
> result_dir = '/home/karthik/Projects/Results'
> param_file = $result_dir/param_file
> res_file = $result_dir/result_file
> comment = 'this is a comment'
>
> K = 8
> simulate_K = 0
>
> N = 4000
> mod_scheme = 'QPSK'
>
> Na = K+2
>
> ######################
>
> As of now i use config parser and i get this in a dictionary but
>
> a) but i have users.na and not users.Na (all the fields are in lower
> case)
>
> b) all the rhs arguements are string, but i have handled this by
> trying " try eval(rhs) ... except ..." block
>
> c) Na = 'K+2' though does not work, would like to have Na = 10, but i
> get users.na = 'K+2'
>
> d) result_file, param_file should actually be should be with pathname
> extensions filled in.
>
> Have looked in c.l.py none one ofthe suggestions was to use
> splitlines, this cant handle blank lines, other was to have config.py
> ..
>
> Hope to get some solution for this ..
>
> with warm regards
>
> karthik
>
>
> --
>
> -----------------------------------------------------------------------
> Karthikesh Raju, email: karthik at james.hut.fi
> Researcher, http://www.cis.hut.fi/karthik
> Helsinki University of Technology, Tel: +358-9-451 5389
> Laboratory of Comp. & Info. Sc., Fax: +358-9-451 3277
> Department of Computer Sc.,
> P.O Box 5400, FIN 02015 HUT,
> Espoo, FINLAND
> -----------------------------------------------------------------------
I modified the config parser that is included as an example that ships with
pyparsing, by adding:
iniLines = "\n".join( file("karthik.ini").readlines() )
config = inifile_BNF().parseString(iniLines)
pprint.pprint( config.asList() )
for k in config.users.keys():
print k,":",config.users[k]
This gives the following output:
[['users',
['source_dir ', " '/home/karthik/Projects/python'"],
['data_dir ', " '/home/karthik/Projects/data'"],
['result_dir ', " '/home/karthik/Projects/Results'"],
['param_file ', ' $result_dir/param_file'],
['res_file ', ' $result_dir/result_file'],
['comment ', " 'this is a comment'"],
['K ', ' 8'],
['simulate_K ', ' 0'],
['N ', ' 4000'],
['mod_scheme ', " 'QPSK'"],
['Na ', ' K+2']]]
comment : 'this is a comment'
data_dir : '/home/karthik/Projects/data'
mod_scheme : 'QPSK'
Na : K+2
K : 8
simulate_K : 0
N : 4000
res_file : $result_dir/result_file
result_dir : '/home/karthik/Projects/Results'
source_dir : '/home/karthik/Projects/python'
param_file : $result_dir/param_file
This actually shows the 3 access modes to the results from a pyparsing
parseString() operation:
- as a raw list of tokens (optionally grouped into sublists, giving a parse
tree)
- as an object with attributes (note reference to 'config.users', also
notice that keys are not converted to lower case)
- as a dictionary (access to config.users[k] for each key k)
The 2nd level keys could also be referenced using the form
config.users.data_dir, config.users.comment, etc.
pyparsing also comes with an expression parser and evaluator in its
examples. With some creative merging of the two, I think you could in
fairly short order have a config parser that would handle your Na = K+2 and
res_file = "$result_dir..." config values.
The pyparsing home page is at http://pyparsing.sourceforge.net.
HTH,
-- Paul
More information about the Python-list
mailing list