2012-01-10 155 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