我有一个要解析的文本,这是文本的简洁形式。
apple {
type=fruit
varieties {
color=red
origin=usa
}
}
输出应如下所示
apple.type=fruit
apple.varieties.color=red
apple.varieties.origin=usa
到目前为止,我唯一想到的是python中一种广度优先的方法。但是我不知道如何让所有孩子都融入其中。
progInput = """apple {
type=fruit
varieties {
color=red
origin=usa
}
}
"""
progInputSplitToLines = progInput.split('\n')
childrenList = []
root = ""
def hasChildren():
if "{" in progInputSplitToLines[0]:
global root
root = progInputSplitToLines[0].split(" ")[0]
for e in progInputSplitToLines[1:]:
if "=" in e:
childrenList.append({e.split("=")[0].replace(" ", ""),e.split("=")[1].replace(" ", "")})
hasChildren()
PS:我研究了Python中的树结构,并遇到了anytree(https://anytree.readthedocs.io/en/latest/),您认为这对我有帮助吗?
请您能帮我一下吗?我不太擅长解析文本。提前谢谢一堆。 :)
答案 0 :(得分:0)
由于文件为HOCON格式,因此您可以尝试使用pyhocon
HOCON解析器模块来解决问题。
安装:要么运行pip install pyhocon
,要么下载github存储库并使用python setup.py install
执行手动安装。
基本用法:
from pyhocon import ConfigFactory
conf = ConfigFactory.parse_file('text.conf')
print(conf)
其中给出了以下嵌套结构:
ConfigTree([('apple', ConfigTree([('type', 'fruit'), ('varieties', ConfigTree([('color', 'red'), ('origin', 'usa')]))]))])
ConfigTree
只是collections.OrderedDict()
,如source code所示。
更新:
要获得所需的输出,可以创建自己的递归函数来收集所有路径:
from pyhocon import ConfigFactory
from pyhocon.config_tree import ConfigTree
def config_paths(config):
for k, v in config.items():
if isinstance(v, ConfigTree):
for k1, v1 in config_paths(v):
yield (k,) + k1, v1
else:
yield (k,), v
config = ConfigFactory.parse_file('text.conf')
for k, v in config_paths(config):
print('%s=%s' % ('.'.join(k), v))
哪些输出:
apple.type=fruit
apple.varieties.color=red
apple.varieties.origin=usa
答案 1 :(得分:0)
@RoadRunner 如何解析 conf 文件中的数组?例如:
apple {
type=fruit
varieties {
color=red
origin=usa
}
}
loo = [
{
name = "abc"
},
{
name = "xyz"
}
]
我想打印所有的名称值,即 abc 和 xyz