2012-07-09 4 views
7

나는 configParser를 사용하여 설정 파일을 가지고있다.ConfigParser가있는 새 줄?</p> <pre><code><br> [ section one ]<br> one = Y,Z,X <br><br> [EG 2]<br> ias = X,Y,Z<br> </code></pre> <p>내 프로그램을 잘 읽고이 값을 처리하는 작업 :

그러나 일부 섹션은 상당히 커질 수 있습니다. 나는 다음과 같이 값이 새 줄에있을 수 있습니다 설정 파일이 필요합니다 내 코드에서

[EG SECTION]<br> 
EG=<br> 
item 1 <br> 
item 2 <br> 
item 3<br> 
etc... 

내가 지금 분명히 string.split()를 사용하여 값의 구분 (또는 분리)를 취하는 간단한 기능을 가지고 쉼표로 설정하십시오. \n의 이스케이프 문자열을 시도했지만 작동하지 않습니다.

파이썬의 구성 파서로 가능한지 아는 사람 있습니까?
http://docs.python.org/library/configparser.html

# We need to extract data from the config 
def getFromConfig(currentTeam, section, value, delimeter): 
    cp = ConfigParser.ConfigParser() 
    fileName = getFileName(currentTeam) 
    cp.read(fileName) 
    try: 
     returnedString = cp.get(section, value) 
    except: # The config file could be corrupted 
     print("Error reading " + fileName + " configuration file.") 
     sys.exit(1) #Stop us from crashing later 
    if delimeter != "": # We may not need to split 
     returnedList = returnedString.split(delimeter) 
    return returnedList 

나는이에 사용하는 것입니다 :

taskStrings = list(getFromConfig(teamName, "Y","Z",",")) 

답변

10

ConfigParser _read() 방법의 문서화 문자열은 말한다 :

Continuations를이 다음 공백을 선도하는 임베디드 줄 바꿈으로 표시됩니다.

또는 대안 (파이썬 3 버전이 말하듯) :

값은 그들이 값의 첫 번째 줄보다 더 깊은 들여으로, 여러 줄에 걸쳐있을 수 있습니다.

이 기능은 값을 분리하여 여러 줄에 걸쳐 계속할 수있는 방법을 제공합니다. 당신은 다음과 같은 코드로 목록으로 EG SECTIONEG의 값을 읽을 수

[EG SECTION]<br> 
EG=<br> 
    item 1<br> 
    item 2<br> 
    item 3<br> 

:

try: 
    import ConfigParser as configparser 
except ImportError: # Python 3 
    import configparser 

cp = configparser.ConfigParser() 
cp.read('test.ini') 

eg = cp.get('EG SECTION', 'EG') 
print(repr(eg)) # -> '\nitem 1\nitem 2\nitem 3' 

cleaned = [item for item in eg.strip().split('\n')] 
print(cleaned) # -> ['item 1', 'item 2', 'item 3'] 
+0

중첩 수준은 어느 정도입니까? 마찬가지로, 가치 중 하나가 다시 의도되지 않은 의도 된 섹션이 있다고 가정 해보십시오. 이것은 다시 부차적 인 하나의 가치를 갖는 것입니다. – Nishant

+1

@Nishant : "들여 쓰기"를 의미한다고 가정하십시오. 먼저 질문에 직접 답할 수 있습니다 (시도하지 않음).그러나 문제를 줄이기 위해 얼마나 많은 항목이 들여 쓰여졌는지 여부는 상관 없습니다. – martineau

+0

미안 해요. 나는 어떤 깊이로 들여 쓰기가 될 수있는 부분을 가지지 만, 내가 깊이 생각한 들여 쓰기 된 항목에 * 더 깊이 들여 쓰기 된 항목이 있다면 무엇을 의미합니까? 중첩의 일반적인 경우를 의미합니다. 나는이 경우에 세 번째 레벨을 추측한다. 나는 당신이 그것을 얻길 바래, 그렇지 않으면 그 벌금 :-) 나는 그것을 시도 할 것이고 아마 다른 질문을 게시 할 것이다! – Nishant

2

이 가능 보인다. 내 자신의 config 파일에서, 예를 들어, 나는 튜플과리스트 객체가 있습니다

[root] 
path:/
redirectlist: [ (r'^magic', '/file'), 
    (r'^avplay', '/file'), 
    (r'^IPTV', '/file'), 
    (r'^box', '/file'), 
    (r'^QAM', '/qam'), 
    (r'.*opentv.*', '/qam'), 
    (r'.+', '/file') ] 

을 내가 할 : 보안을 일으킬 수 실제로 그 라인을 eval'ing하고

redirectstr = _configdict.get('root', 'redirectlist') 
redirects = eval(redirectstr) 

메모를, 야생에서 사용되는 경우 위반.

+6

당신이 할 수있는 것 같습니다 예를 들어, 그래서 당신은 포함 'test.ini'라는 이름의 설정 파일을 가지고 있었다 이것은 간단하게'eval'을'ast.literal_eval'로 바꾸는 것만으로 간단하게 파이썬 객체 (사전, 문자열,리스트, 터플, 부동 소수점 및 정수)가 아닌 객체를 입력하도록 허용하지 않는 한 안전하게 수행 할 수 있습니다. – mgilson