2010-08-10 60 views
1

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

我不能够读取包含[]配置文件节......对于例如,如果在ini文件任何部分是一样的东西[c:\\temp\\foo[1].txt]比我的脚本无法读取该节..

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

感谢, 维涅什

+1

什么是“节”? – nosklo 2010-08-10 11:50:40

+0

请指出'config'是'ConfigParser.RawConfigParser'的子类的一个实例。 – Philipp 2010-08-10 12:15:13

回答

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

发生这种情况是因为用于解析头的正则表达式 - 它只能走到第一个右括号。

您可以通过继承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')