无法读取包含[]的配置文件部分

时间:2010-08-10 11:39:40

标签: python

已编辑的帖子

我无法读取包含[]的配置文件部分...例如,如果ini文件中的任何部分类似于[c:\\temp\\foo[1].txt],那么我的脚本无法读取该部分。

config.read(dst_bkp)
for i in config.sections():
    config.get(i,'FileName') 

谢谢, 维涅什

2 个答案:

答案 0 :(得分:3)

假设您使用ConfigParser.RawConfigParser模块的内置子类:这不受支持。即使在newest revision中,节标题的正则表达式也只是

SECTCRE = re.compile(
    r'\['                                 # [
    r'(?P<header>[^]]+)'                  # very permissive!
    r'\]'                                 # ]
    )

没有转义机制,节标题只是在第一个右括号结束。您应该只使用没有“特殊字符”的简单字符串作为标题名称,而不是文件名之类的任意字符串。

编辑:关于Python 3,equivalent code已经重新组织了一下,但正则表达式是相同的:

_SECT_TMPL = r"""
    \[                                 # [
    (?P<header>[^]]+)                  # very permissive!
    \]                                 # ]
    """

编辑2 :您可以按照其他解决方案的建议制作自己的子类,也可以直接修补RawConfigParser

import ConfigParser
import re
ConfigParser.RawConfigParser.SECTCRE = re.compile(r"\[(?P<header>.+)\]")

但是,我建议不要做任何这些并避免使用括号。如果在节标题中有括号,则配置文件可能不可移植。

答案 1 :(得分:1)

这是因为用于解析标题的正则表达式 - 它只能到第一个结束括号。

您可以通过继承ConfigParser.ConfigParser

来为您的程序修复它
import ConfigParser
import re

class MyConfigParser(ConfigParser.ConfigParser):
    SECTCRE = re.compile(
        r'\['                                 # [
        r'(?P<header>.+)'                     # even more permissive!
        r'\]'                                 # ]
        )

config = MyConfigParser()
config.read(dst_bkp)
for i in config.sections():
    config.get(i,'FileName')