是否可以暂时禁用Python的字符串插值?
我在用Python的日志模块设置一个记录器。我想把我用的日志格式字符串存储在一个配置文件里,使用的是ConfigParser模块。
这个格式字符串被存储在一个设置字典中,放在一个单独的文件里,这个文件负责读取和写入配置文件。我的问题是,Python在读取这些特定于日志模块的格式标记时,还是会尝试格式化,结果就出错了。
{
"log_level":logging.debug,
"log_name":"C:\\Temp\\logfile.log",
"format_string":
"%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s"
}
我的问题很简单:我该如何在这里禁用格式化功能,同时又能在其他地方保留它。我的初步想法是大量使用反斜杠来转义各种百分号,但这样做会永久性地破坏格式化,导致即使在需要的时候也无法正常工作。
我还应该提到,因为在评论中提到过,ConfigParser会进行一些内部的插值处理,这也是导致问题的原因。以下是我的错误追踪信息:
Traceback (most recent call last):
File "initialconfig.py", line 52, in <module>
"%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s"
File "initialconfig.py", line 31, in add_settings
self.set(section_name, setting_name, default_value)
File "C:\Python26\lib\ConfigParser.py", line 668, in set
"position %d" % (value, m.start()))
ValueError: invalid interpolation syntax in '%(asctime)s %(levelname)s: %(module
)s, line %(lineno)d - %(message)s' at position 10
另外,如果能给一些关于良好设置文件实践的建议就更好了。这是我第一次在ConfigParser(或者说日志方面)做一些重要的事情。
提前谢谢你, Dominic
相关问题:
6 个回答
18
你还可以把插值设置为 None。
config = ConfigParser(strict=False, interpolation=None)
(我使用的是 Python 3.6.0)
18
你可能想用 ConfigParser.RawConfigParser 来代替 ConfigParser.ConfigParser。只有后者会对配置值进行一些神奇的处理。
补充说明:
其实,使用 ConfigParser.SafeConfigParser 的话,你可以通过在格式字符串前加一个 % 百分号来避免格式化问题。这个例子应该可以正常工作:
{
"log_level":logging.debug,
"log_name":"C:\\Temp\\logfile.log",
"format_string":
"%%(asctime)s %%(levelname)s: %%(module)s, line %%(lineno)d - %%(message)s"
}
19
你试过用 %% 来转义百分号吗?