6

我在 .ini 文件中有这样的东西

[General]
verbosity = 3   ; inline comment

[Valid Area Codes]
; Input records will be checked to make sure they begin with one of the area 
; codes listed below.  

02    ; Central East New South Wales & Australian Capital Territory
03    ; South East Victoria & Tasmania
;04    ; Mobile Telephones Australia-wide
07    ; North East Queensland
08    ; Central & West Western Australia, South Australia & Northern Territory

但是,我遇到的问题是内联注释在该key = value行中有效,但在key没有值的行中无效。这是我创建 ConfigParser 对象的方式:

>>> import ConfigParser
>>> c = ConfigParser.SafeConfigParser(allow_no_value=True)
>>> c.read('example.ini')
['example.ini']
>>> c.get('General', 'verbosity')
'3'
>>> c.options('General')
['verbosity']
>>> c.options('Valid Area Codes')
['02    ; central east new south wales & australian capital territory', '03    ; south east victoria & tasmania', '07    ; north east queensland', '08    ; central & west western australia, south australia & northern territory']

如何设置配置解析器以便内联注释适用于这两种情况?

4

3 回答 3

10

根据 ConfigParser 文档

“配置文件可能包含以特定字符(# 和 ;)为前缀的注释。注释可能会单独出现在空行中,或者可以在包含值或部分名称的行中输入

在您的情况下,您在仅包含没有值的键的行中添加注释(因此它将不起作用),这就是您获得该输出的原因。

参考:http : //docs.python.org/library/configparser.html#safeconfigparser-objects

于 2012-02-29T05:55:32.640 回答
7

[编辑]

现代 ConfigParser 支持内联注释。

settings_cfg = configparser.ConfigParser(inline_comment_prefixes="#")

但是,如果您想为支持的方法浪费函数声明,这是我的原始帖子:


[原来的]

正如 SpliFF 所说,文档说内嵌注释是禁忌。第一个冒号或等号右边的所有内容都作为值传递,包括注释分隔符。

这太糟糕了。

所以,让我们解决这个问题:

def removeInlineComments(cfgparser):
    for section in cfgparser.sections():
        for item in cfgparser.items(section):
            cfgparser.set(section, item[0], item[1].split("#")[0].strip())

上面的函数遍历 configParser 对象的每个部分中的每个项目,在任何“#”符号上分割字符串,然后从剩余值的前缘或后缘剥离()任何空白,并只写回价值,没有内联评论。

这是此函数的更 Pythonic(如果可以说是不太清晰)列表理解版本,它允许您指定要拆分的字符:

def removeInlineComments(cfgparser, delimiter):
    for section in cfgparser.sections():
        [cfgparser.set(section, item[0], item[1].split(delimiter)[0].strip()) for item in cfgparser.items(section)]
于 2019-04-11T23:41:29.440 回答
0

也许试试吧02= ; comment

于 2012-02-29T01:49:38.090 回答