Python:解析文本文件并创建树结构

时间:2015-09-06 17:50:40

标签: python data-structures tree

解析纯文本树结构的最佳方法是:

node1:
    node1
    node2:
        node1
node2:
    node1
    node2
    node3:
        node1:
            node1
        node2:
            node1
            node2

并将其转换为树结构(带有列表或词典)?

是否有任何python库可以帮助我解析?

2 个答案:

答案 0 :(得分:4)

rson库将执行此操作,除非您可能必须将解析器子类化以允许在单个结构中混合数组和dict样式元素。

修改实际上,这可能有点困难,但rsonlite包将(按类别)与您的数据一起工作。

rsonlite是一个小型的单模块软件包,只有300行,同样的源代码适用于Python 2和Python 3。

以下示例显示了数据的3种不同输出。第一个输出是rsonlite.dumps()给出的,第二个输出是略高级rsonlite.simpleparse()给出的,第三个输出从simpleparse获取结果并通过自定义{{ 1}}用于创建纯嵌套字典数据结构的函数,其中任何缺失值都设置为fixup(),并且检查并去除所有冒号字符。

None

会给:

  

[(' node1:',[' node1',(' node2:',[' node1'])] ),(' node2:',[' node1',   ' node2',(' node3:',[(' node1:',[' node1']),(&#39 ; node2:',[' node1',   '节点2'])])])]

     

OrderedDict([' node1:',[' node1',OrderedDict([' node2:',   ' node1')])]),(' node2:',[' node1',' node2',OrderedDict([(& #39;节点3:&#39 ;,   OrderedDict([(' node1:',' node1'),(' node2:',[' node1',   '节点2'])]))])])])

     

{' node1':{' node1':无,' node2':' node1'},' node2&# 39;:{' node1':无,   ' node2':无,' node3':{' node1':' node1',' node2':{& #39; node1':无,   ' node2':无}}}}

答案 1 :(得分:1)

您可以构造一个简单的解析器,从输入生成有效的python表达式,然后对其进行求值。我最初的想法是一个简单的递归解析器,但这比我预期的要困难,因为他们无法知道块在没有前面的峰值的情况下结束 - 这是基于缩进格式的常见问题。

这会生成嵌套的元组列表(block_name,[contents]):

i = 0
r = '['
for l in mystring.split('\n'):
    if not l:
        continue
    cl = l.lstrip(' ')
    ci = (len(l) - len(cl))//4
    if ci > i:           # line indented
        r += '['
    elif ci < i:         # line unindented, can be multiple
        r += '])'*(i-ci) + ','
    if cl[-1] == ':':    # new block
        r += '{("{}":'.format(cl[:-1])
    else:                # new item
        r += '"{}",'.format(cl)
    i = ci
r += ']'+')]'*i
eval(r)

输出:

[('node1', ['node1', ('node2', ['node1'])]),
 ('node2',
  ['node1',
   'node2',
   ('node3', [('node1', ['node1']), ('node2', ['node1', 'node2'])])])]