best way to read a configuration file

Paul McGuire bogus at bogus.net
Wed Mar 3 12:35:25 CET 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