就像之前已经指出的那样str.lstrip()
不是变异器,索引在我的系统中也变得准确。
但问题是,当您意识到该行的索引已增加时,line
实际上是指向增加的索引线,例如,在第一种情况下,我们注意到线的索引增加于line ba
, so line
指着line ba
,然后在你的if
条件,你做-
ret[line.strip()] = parse_message_to_tree_helper(buf, index)
这是错误的,因为您将设置返回的任何内容parse_message_to_tree_helper()
to line ba
,而不是其实际的父级。
另外,一旦您在函数内部递归,除非文件已完全读取,否则您不会出来,但是特定行在字典中存储的级别取决于缩进减少时递归的结果。
我不确定是否有任何内置库可以帮助您做到这一点,但是我能够想出一个代码(很大程度上基于您的代码)-
def parse_message_to_tree(message):
buf = StringIO(message)
return parse_message_to_tree_helper(buf, 0, None)[0]
def parse_message_to_tree_helper(buf, prev, prevline):
ret = {}
index = -1
for line in buf:
line = line.rstrip()
index = len(line) - len(line.lstrip())
print (line + " => " + str(index))
if index > prev:
ret[prevline.strip()],prevline,index = parse_message_to_tree_helper(buf, index, line)
if index < prev:
return ret,prevline,index
continue
elif not prevline:
ret[line.strip()] = {}
else:
ret[prevline.strip()] = {}
if index < prev:
return ret,line,index
prevline = line
if index == -1:
ret[prevline.strip()] = {}
return ret,None,index
if prev == index:
ret[prevline.strip()] = {}
return ret,None,0
示例/演示 -
>>> print(s)
line a
line b
line ba
line bb
line bba
line bc
line c
line ca
line caa
>>> def parse_message_to_tree(message):
... buf = StringIO(message)
... return parse_message_to_tree_helper(buf, 0, None)[0]
...
>>> def parse_message_to_tree_helper(buf, prev, prevline):
... ret = {}
... index = -1
... for line in buf:
... line = line.rstrip()
... index = len(line) - len(line.lstrip())
... print (line + " => " + str(index))
... if index > prev:
... ret[prevline.strip()],prevline,index = parse_message_to_tree_helper(buf, index, line)
... if index < prev:
... return ret,prevline,index
... continue
... elif not prevline:
... ret[line.strip()] = {}
... else:
... ret[prevline.strip()] = {}
... if index < prev:
... return ret,line,index
... prevline = line
... if index == -1:
... ret[prevline.strip()] = {}
... return ret,None,index
... if prev == index:
... ret[prevline.strip()] = {}
... return ret,None,0
...
>>> pprint.pprint(parse_message_to_tree(s))
line a => 0
line b => 0
line ba => 2
line bb => 2
line bba => 4
line bc => 2
line c => 0
line ca => 2
line caa => 4
{'line a': {},
'line b': {'line ba': {}, 'line bb': {'line bba': {}}, 'line bc': {}},
'line c': {'line ca': {'line caa': {}}}}
>>> s = """line a
... line b
... line ba
... line bb
... line bba
... line bc
... line c
... line ca
... line caa
... line d"""
>>> pprint.pprint(parse_message_to_tree(s))
line a => 0
line b => 0
line ba => 2
line bb => 2
line bba => 4
line bc => 2
line c => 0
line ca => 2
line caa => 4
line d => 0
{'line a': {},
'line b': {'line ba': {}, 'line bb': {'line bba': {}}, 'line bc': {}},
'line c': {'line ca': {'line caa': {}}},
'line d': {}}
您需要测试代码是否有更多错误或一些遗漏的情况。