Config files with different types
MRAB
python at mrabarnett.plus.com
Thu Jul 2 14:12:07 EDT 2009
Zach Hobesh wrote:
> Hi all,
>
> I've written a function that reads a specifically formatted text file
> and spits out a dictionary. Here's an example:
>
> config.txt:
>
> Destination = C:/Destination
> Overwrite = True
>
>
> Here's my function that takes 1 argument (text file)
>
> the_file = open(textfile,'r')
> linelist = the_file.read().split('\n')
You could use .splitlines() or iterate over the file itself.
> the_file.close()
> configs = {}
> for line in linelist:
> try:
> key,value = line.split('=')
> key.strip()
> value.strip()
> key.lower()
> value.lower()
Strings are immutable. These methods don't modify the strings, but
_return_ the result.
> configs[key] = value
>
> except ValueError:
> break
>
'break' will leave the loop. Is this intentional?
> so I call this on my config file, and then I can refer back to any
> config in my script like this:
>
> shutil.move(your_file,configs['destination'])
>
> which I like because it's very clear and readable.
>
> So this works great for simple text config files. Here's how I want
> to improve it:
>
> I want to be able to look at the value and determine what type it
> SHOULD be. Right now, configs['overwrite'] = 'true' (a string) when
> it might be more useful as a boolean. Is there a quick way to do
> this? I'd also like to able to read '1' as an in, '1.0' as a float,
> etc...
>
> I remember once I saw a script that took a string and tried int(),
> float() wrapped in a try except, but I was wondering if there was a
> more direct way.
>
The way you saw was the safe, and recommended, way.
When checking for Boolean you might want to ignore the case; something
like:
bool_dict = {"false": False, "true": True}
...
try:
value = bool_dict[value.strip().lower()]
except ValueError:
# Not a Boolean.
...
More information about the Python-list
mailing list