2012-01-10 130 views
2

我這下面的代碼段:需要幫助解析配置數據

all_messages = {} 
num = None 
index = None 
begin_message = lambda x: re.match(r'^([0-9]+)\: (.+)', x) 
with open(filename) as f: 
    messages = {} 
    message = [] 
    for line in f: 
     m = re.match(r'^\[(.+)\]$', line) 
     if m: 
      if index: 
       messages.update({num: '\n'.join(message)}) 
       num = None 
       all_messages.update({index: messages}) 
      index = m.group(1) 
      print index 
     elif begin_message(line): 
      if num: 
       messages.update({num: '\n'.join(message)}) 
      del message[:] 
      num = int(begin_message(line).group(1)) 
      begin = begin_message(line).group(2).strip() 
      if begin: 
       message.append(begin) 
     else: 
      cont = line.strip() 
      if cont: 
       if num: 
        message.append(cont) 
    else: 
     end = line.strip() 
     if end: 
      if num: 
       messages.update({num: '\n'.join(message)}) 
     all_messages.update({index: messages}) 
print all_messages 

我試圖解析出類似這樣的一個配置文件:

[Message 1] 
1: Hello 
2: Hi 
3: Blah 
    Hah 

[Message 2] 
1: Hi 
2: How's it going? 
3: Great. 
4: Yep 

我搶指數爲內容,然後是每封郵件,除了當我嘗試更新字典時,所有內容都能正常工作,它似乎將隨後的郵件替換爲開頭郵件。

比如我期待字典這樣:

{ "Message 1": 
    { 1: "Hello", 
    2: "Hi", 
    3: "Blah\nHah" 
    }, 
    "Message 2": 
    { 1: "Hi", 
    2: "How's it going", 
    3: "Great.", 
    4: "Yep" 
    } 
} 

但我結束了:

{ "Message 1": 
    { 1: "Hi", 
    2: "How's it going", 
    3: "Great.", 
    4: "Yep" 
    }, 
    "Message 2": 
    { 1: "Hi", 
    2: "How's it going", 
    3: "Great.", 
    4: "Yep" 
    } 
} 

感謝所有幫助

+2

您是否嘗試過使用[configparser](http://docs.python.org/library/configparser.html)庫? – 2012-01-10 15:02:04

回答

3

您正在重新實現Python的ConfigParser模塊,我建議您停止。

>>> import ConfigParser 
>>> config = ConfigParser.ConfigParser() 
>>> config.read('8805198.cfg') 
['8805198.cfg'] 
>>> d = dict((section, dict(config.items(section))) for section in config.sections()) 
>>> print d 
{'Message 1': {'1': 'Hello', '3': 'Blah\nHah', '2': 'Hi'}, 'Message 2': {'1': 'Hi', '3': 'Great.', '2': "How's it going?", '4': 'Yep'}} 
>>> print d['Message 1'] 
{'1': 'Hello', '3': 'Blah\nHah', '2': 'Hi'} 
>>> print d['Message 1']['3'] 
Blah 
Hah 
+1

謝謝,這將完美工作。 – mikeyy 2012-01-10 15:15:57

2

我不知道什麼是錯的使用您發佈的代碼,而不是編寫自己的配置文件解析器,您可以使用ConfigParser,它是標準庫的一部分。查看文檔頁面的最後一個使用ConfigParser的示例。

+0

ConfigParser不允許我做我想要的,但謝謝你的建議。 – mikeyy 2012-01-10 15:03:35

+3

+1無需重新發明車輪。 – 2012-01-10 15:03:49

+1

@mikeyy:什麼不是ConfigParser所需要的? – Johnsyweb 2012-01-10 15:10:32