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

时间:2010-10-28 14:33:55

标签: python escaping interpolation

我想对configobj配置文件的值使用解析时间和运行时插值。在Python中进行简单字符串插值的最简单方法是"%(foo)s" % somedict。不幸的是,configobj使用相同的插值机制,我还没有找到逃脱它的方法。理想情况下,我的价值看起来像:

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

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

5 个答案:

答案 0 :(得分:10)

自发布此问题以来,情况可能已发生变化,但我发现您可以使用'%'焦炭。这在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'

希望将来帮助某人(:

答案 1 :(得分:4)

是的,遗憾的是,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'

答案 2 :(得分:3)

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

答案 3 :(得分:2)

深入研究文档我找到了一个比bobince提出的解决方案更合适的解决方案:使用不同的插值引擎,例如interpolation="template"。它有两个优点。

  1. 不会影响%符号。
  2. 支持转义。 ($$内插到$。)
  3. 示例如下:

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

答案 4 :(得分:1)

答案的新版本:

您可以使用“.format()(Python 2.6或更高版本)或string.Template(Python 2.4或更高版本)进行运行时插值 - 这两种方法都可以消除冲突。

(旧版本假定使用标准的ConfigParser模块,因此注释。)