如何在configobj值中转义%符号?

问题描述:

我想使用解析时间和运行时插值的configobj配置文件的值。在Python中执行简单字符串插值的最简单方法是"%(foo)s" % somedict。不幸的是,configobj使用相同的插值机制,我还没有找到一种方法来逃避它。理想情况下,我的价值如下:如何在configobj值中转义%符号?

othervar = foo 
someconfigobjkey = %(othervar)s %%(runtimevar)s 

但是,configobj尝试(并失败)替换第二个变量。解决这个问题的另一种方法是提供一种不同的(configobj)方法来执行解析时间和运行时间插值。

答案的新版本:

你可以使用“” .format()(Python的2.6以上)或string.Template(是Python 2.4或以上)的运行时间插值 - 两者都将消除冲突。

(旧版本假定使用标准configparser模块用来的,因此评论。)

+0

正如我在我的第一个问题中所述,我使用configobj而不是ConfigParser。也许我认为这个模块被称为太远无论如何它可以在http://www.voidspace.org.uk/python/configobj.html找到。 – 2010-10-28 14:50:48

+0

所以瑞,我不知道这个模块,也没有在你的文章中将它识别为模块名称。任何不使用标准ConfigParser模块的原因?如果这也能为你做好,那么问题也将得到解决:) – 2010-10-28 14:55:31

+0

在企业发展中,并不总是选择工具。 – 2010-10-28 14:57:29

是的,不幸的是configobj不按照正常的标准Python格式规则,所以%%,这本来是正确的方法逃避百分号,失败。对我来说似乎有点设计缺陷。

我能想到的有一个configobj值文字%(foo)s序列的唯一方法是确保自身通过替换生成的序列的一部分:

>>> import configobj 
>>> c= configobject.ConfigObj() 
>>> c['foo']= 'bar' 
>>> c['pc']= '%' 
>>> c['v']= '%(foo)s %(pc)s(foo)s' 
>>> c['v'] 
'bar %(foo)s' 

挖我发现文档中更深比bobince提出的解决方案更适合:使用不同的插值引擎,如interpolation="template"。它有两个优点。

  1. 不会干扰%符号。
  2. 支持转义。 ($$被插入到$。)

的例子看起来像:

othervar = foo 
someconfigobjkey = $othervar %(runtimevar)s 
+0

这是使用的方法!请注意'cfg = configobj.ConfigObj(...,interpolation ='template')'似乎对验证没有影响,后面的'cfg.validate(...)'仍然会失败。通过设置'configobj.DEFAULT_INTERPOLATION ='template'',可以改变默认的插补器。这适用于Python 2和Python 3. – 2017-04-12 09:45:37

尝试使用 '%' + '(富)S'。在处理ConfigParser时,这对我有用。

自发布此问题以来可能发生了变化,但我发现您可以使用'%'字符转义。这在Python 3

为我工作在我的config.ini文件:

[LOGGING] 
format = %%(asctime)-15s %%(message)s 

在我的Python脚本文件:

import configparser 

# Load configuration 
config = configparser.ConfigParser() 
config.read("config.ini") 

log_config = config['LOGGING'] 

print(log_config['format']) # prints out '%(asctime)-15s %(message)s' 

希望它可以帮助别人的未来(:

+0

这对SafeConfigParser适合我! – 2016-03-08 01:40:42