gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:50:06 24 4
gpt4 key购买 nike

解析像这样的纯文本树结构的最佳方法是什么:

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

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

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

最佳答案

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

编辑 实际上,这可能有点困难,但是 rsonlite包将(某种程度上)按原样处理您的数据。

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

这是一个显示 3 种不同数据输出的示例。第一个输出是 rsonlite.dumps() 给出的,第二个输出是稍微高级一点的 rsonlite.simpleparse() 给出的,第三个输出是结果来自 simpleparse 并通过自定义 fixup() 函数运行它们以创建纯嵌套字典数据结构,其中任何缺失值都简单地设置为 None, 并检查并删除所有冒号字符。

from rsonlite import loads, simpleparse


mystring = '''
node1:
node1
node2:
node1
node2:
node1
node2
node3:
node1:
node1
node2:
node1
node2
'''

def fixup(node):
if isinstance(node, str):
return node
elif isinstance(node, dict):
for key in node:
assert key.endswith(':'), key
return dict((key[:-1], fixup(value)) for key, value in node.items())
else:
assert isinstance(node, (list, str))
result = {}
for item in node:
if isinstance(item, str):
assert not item.endswith(':')
assert result.setdefault(item, None) is None
else:
for key, value in fixup(item).items():
assert result.setdefault(key, value) is value
return result

print('')
print(loads(mystring))
print('')
print(simpleparse(mystring))
print('')
print(fixup(simpleparse(mystring)))
print('')

将给予:

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

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

{'node1': {'node1': None, 'node2': 'node1'}, 'node2': {'node1': None, 'node2': None, 'node3': {'node1': 'node1', 'node2': {'node1': None, 'node2': None}}}}

关于Python:解析文本文件并创建树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32426522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com