我有以下这段代码:
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"
}
}
感谢您的帮助
答案 0 :(得分: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 :(得分:2)
我不确定您发布的代码有什么问题,但您可以使用ConfigParser作为标准库的一部分,而不是编写自己的配置文件解析器。有关使用ConfigParser的示例,请参见文档页面的最后。