首页 > 解决方案 > 在 Python 中解析自定义文本文件

问题描述

我有一个要解析的文本,这是文本的简洁形式。

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/),你认为这对我的情况有帮助吗?

你能帮帮我吗?我不太擅长解析文本。提前感谢一堆。:)

标签: pythonparsing

解决方案


由于您的文件是 HOCON 格式,您可以尝试使用pyhoconHOCON 解析器模块来解决您的问题。

安装:运行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()中所见。

更新:

要获得所需的输出,您可以创建自己的递归函数来收集所有路径:

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

推荐阅读