python - 如何从树状文件目录文本文件创建嵌套字典对象?

标签 python python-3.x string parsing string-parsing

我有一个由选项卡和行分隔的树结构,如下所示:

a
\t1
\t2
\t3
\t\tb
\t\tc
\t4
\t5

And I am looking to turn this into:

{
'name': 'a',
'children': [
 {'name': '1'},
 {'name': '2'},
 {
   'name': '3'
   'children': [
      {'name': 'b'},
      {'name': 'c'}
    ]
  },
  {'name': '4'},
  {'name': '5'}
  ]
}

用于 d3.js 可折叠树数据输入。我假设我必须以某种方式使用递归,但我不知道如何使用。

我尝试将输入变成这样的列表:

[('a',0), ('1',1), ('2',1), ('3',1), ('b',2), ('c ',2), ('4',1), ('5',1)]

使用此代码:

def parser():
    #run from root `retail-tree`: `python3 src/main.py`
    l, all_line_details = list(), list()
    with open('assets/retail') as f:
        for line in f:
            line = line.rstrip('\n ')
            splitline = line.split('    ') 
            tup = (splitline[-1], len(splitline)-1)
            l.append(splitline)
            all_line_details.append(tup)
            print(tup)
    return all_line_details

这里,第一个元素是字符串本身,第二个元素是该行中的制表符数量。不确定完成此操作的递归步骤。感谢任何帮助!

最佳答案

您可以使用一个函数,该函数使用 re.findall 和一个正则表达式,该正则表达式匹配一行作为节点名称,后跟 0 或多行以制表符开头的行,分组为子项,然后在从子字符串中剥离每行的第一个制表符后,递归地为子字符串构建相同的结构:

import re
def parser(s):
    output = []
    for name, children in re.findall(r'(.*)\n((?:\t.*\n)*)', s):
        node = {'name': name}
        if children:
            node.update({'children': parser(''.join(line[1:] for line in children.splitlines(True)))})
        output.append(node)
    return output

因此给定:

s = '''a
\t1
\t2
\t3
\t\tb
\t\tc
\t4
\t5
'''

解析器[0]返回:

{'name': 'a',
 'children': [{'name': '1'},
              {'name': '2'},
              {'name': '3', 'children': [{'name': 'b'}, {'name': 'c'}]},
              {'name': '4'},
              {'name': '5'}]}

关于python - 如何从树状文件目录文本文件创建嵌套字典对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55437686/

相关文章:

python - 在 Python 中将单词位置编号附加到 Unicode 文本

python - Pandas - 搜索术语(无论搜索术语的大小写)

python-3.x - 包装io.BufferedIOBase,使其变为可搜索

python - 使用 python 对文件进行排序

将十六进制转换为单精度 IEEE-754 浮点的 Python 程序

Python 2 中的 Python 3 f-string 替代品

python - 如何根据列标签获取数据框的交集?

c - 如何从这一行获取数组?

string - 遍历一个字符串,一次 n 个元素

c++ - 如果附加在末尾,则 const 字符串不起作用