我在.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']
如何设置配置解析器,以便内联注释适用于这两种情况?
答案 0 :(得分:10)
根据ConfigParser文档
“配置文件可能包含以特定字符为前缀的注释(#和;)。注释可能会在空行中出现,或者可能会在包含值或部分名称的行中输入 “
在你的情况下,你只是在没有值的行中添加注释(因此它不起作用),这就是你得到那个输出的原因。
REFER: http://docs.python.org/library/configparser.html#safeconfigparser-objects
答案 1 :(得分:1)
[编辑]
现代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对象每个部分中的每个项目,将字符串拆分为任何“#”符号,然后从剩余值的前缘或后缘剥离strip()的任何空白,并写入仅返回值,没有内联注释。
这是此功能的更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)]
答案 2 :(得分:0)
也许请尝试02= ; comment
。