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

2 投票
2 回答
1369 浏览
提问于 2025-04-16 02:34

编辑过的帖子

我无法读取配置文件中包含 [] 的部分... 比如,如果 ini 文件中的某个部分是 [c:\\temp\\foo[1].txt] 这样的格式,我的脚本就无法读取这个部分了。

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

谢谢,
Vignesh

2 个回答

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') 
3

假设你在使用 ConfigParser.RawConfigParser 模块的一个内置子类:这是不被支持的。即使在最新版本中,关于节标题的正则表达式也只是:

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

这里没有转义机制,节标题会在第一个闭合括号处结束。你应该只使用简单的字符串作为标题名称,避免使用像文件名那样的任意字符串,也就是说,不要用“特殊字符”。

编辑:关于 Python 3,相应的代码稍微进行了重新组织,但正则表达式是一样的:

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

编辑 2:你可以像其他解决方案中建议的那样,自己创建一个子类,或者直接修改 RawConfigParser

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

不过,我建议你不要这样做,尽量避免使用括号。如果你的节标题中有括号,你的配置文件可能会变得不易移植。

撰写回答