Preserve case in ConfigParser?
Solution 1:
The documentation is confusing. What they mean is this:
import ConfigParser, os
def get_config():
config = ConfigParser.ConfigParser()
config.optionxform=str
try:
config.read(os.path.expanduser('~/.myrc'))
return config
except Exception, e:
log.error(e)
c = get_config()
print c.options('rules')
I.e. override optionxform, instead of calling it; overriding can be done in a subclass or in the instance. When overriding, set it to a function (rather than the result of calling a function).
I have now reported this as a bug, and it has since been fixed.
Solution 2:
For me worked to set optionxform
immediately after creating the object
config = ConfigParser.RawConfigParser()
config.optionxform = str
Solution 3:
Add to your code:
config.optionxform = lambda option: option # preserve case for letters
Solution 4:
I know this question is answered, but I thought some people might find this solution useful. This is a class that can easily replace the existing ConfigParser
class.
Edited to incorporate @OozeMeister's suggestion:
class CaseConfigParser(ConfigParser):
def optionxform(self, optionstr):
return optionstr
Usage is the same as normal ConfigParser
.
parser = CaseConfigParser()
parser.read(something)
This is so you avoid having to set optionxform
every time you make a new ConfigParser
, which is kind of tedious.
Solution 5:
Caveat:
If you use defaults with ConfigParser, i.e.:
config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'})
and then try to make the parser case-sensitive by using this:
config.optionxform = str
all your options from config file(s) will keep their case, but FOO_BAZ
will be converted to lowercase.
To have defaults also keep their case, use subclassing like in @icedtrees answer:
class CaseConfigParser(ConfigParser.SafeConfigParser):
def optionxform(self, optionstr):
return optionstr
config = CaseConfigParser({'FOO_BAZ': 'bar'})
Now FOO_BAZ
will keep it's case and you won't have InterpolationMissingOptionError.