2010-08-10 91 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')