在ConfigParser中保留大小写?


90

我尝试使用Python的ConfigParser模块保存设置。对于我的应用程序,重要的是要在我的部分中保留每个名称的大小写。文档提到将str()传递给ConfigParser.optionxform()可以完成此操作,但对我而言不起作用。名称均为小写。我想念什么吗?

<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz

我得到的Python伪代码:

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')
[('monkey', 'foo'), ('ferret', 'baz')]

Answers:


114

该文档令人困惑。他们的意思是:

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')

即覆盖optionxform,而不是调用它;重写可以在子类或实例中完成。覆盖时,将其设置为函数(而不是调用函数的结果)。

我现在将其报告为Bug,此问题已得到修复。


谢谢。它有效,并且我同意文档令人困惑。
pojo

39

对我来说,创建对象后立即设置optionxform

config = ConfigParser.RawConfigParser()
config.optionxform = str 

2
很棒!(请注意,在python 3中,它是“ configparser”类名(无大写字母)
Noam Manos

1
@NoamManos:您指的是模块名称(类名称仍为ConfigParser)。
乔纳斯·比斯特罗姆(JonasByström)'16

2
请注意,它也适用于ConfigParser.ConfigParser()
Jean-Francois T.

确实。有用。值得一提的是,由于ConfigParser()类也支持该参数,因此该参数实际上与RawConfigParser()无关。谢啦。
ivanleoncz

7

添加到您的代码:

config.optionxform = lambda option: option  # preserve case for letters

1
这似乎至少在python 2.7中对我有用,并且比公认的答案干净得多。谢谢foo!
hrbdg

2
这与得分最高的答案相同-请参见行config.optionxform=str:)而不是您的lamdba @Martin v。Löwis使用嵌入式str功能
xuthus

@xuthus-实际上,您可以使用11行代码而不是1行。随你心意。
FooBar167

4

我知道这个问题已经解决,但是我认为有些人可能会觉得此解决方案有用。这是一个可以轻松替换现有ConfigParser类的类。

编辑以合并@OozeMeister的建议:

class CaseConfigParser(ConfigParser):
    def optionxform(self, optionstr):
        return optionstr

用法与普通的ConfigParser相同。

parser = CaseConfigParser()
parser.read(something)

这样可以避免每次创建new时都必须设置optionxform ConfigParser,这很繁琐。


由于optionxform只是的一种方法RawConfigParser,如果您打算进一步创建自己的子类,则应该改写子类上的方法,而不是在每次实例化时都重新定义它:class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
OozeMeister

@OozeMeister好主意!
icedtrees

2

警告:

如果对ConfigParser使用默认值,即:

config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'})

然后尝试使用以下命令使解析器区分大小写:

config.optionxform = str

配置文件中的所有选项均会保留大小写,但FOO_BAZ会转换为小写。

要使默认值也保持大小写,请使用@icedtrees答案中的子类:

class CaseConfigParser(ConfigParser.SafeConfigParser):
    def optionxform(self, optionstr):
        return optionstr

config = CaseConfigParser({'FOO_BAZ': 'bar'})

现在FOO_BAZ将保持这种情况,您将不会遇到InterpolationMissingOptionError

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.