如何在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模块用来的,因此评论。)
是的,不幸的是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"
。它有两个优点。
- 不会干扰%符号。
- 支持转义。 (
$$
被插入到$
。)
的例子看起来像:
othervar = foo
someconfigobjkey = $othervar %(runtimevar)s
这是使用的方法!请注意'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'
希望它可以帮助别人的未来(:
这对SafeConfigParser适合我! – 2016-03-08 01:40:42
正如我在我的第一个问题中所述,我使用configobj而不是ConfigParser。也许我认为这个模块被称为太远无论如何它可以在http://www.voidspace.org.uk/python/configobj.html找到。 – 2010-10-28 14:50:48
所以瑞,我不知道这个模块,也没有在你的文章中将它识别为模块名称。任何不使用标准ConfigParser模块的原因?如果这也能为你做好,那么问题也将得到解决:) – 2010-10-28 14:55:31
在企业发展中,并不总是选择工具。 – 2010-10-28 14:57:29