Разбор пользовательского текстового файла в Python - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть текст для анализа, это краткая форма текста.

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 и наткнулся на любое дерево (https://anytree.readthedocs.io/en/latest/), Как вы думаете, это поможет в моем случае?

Не могли бы вы помочь мне? Я не очень хорош в разборе текста. спасибо большое заранее. :)

1 Ответ

0 голосов
/ 07 ноября 2018

Поскольку ваш файл в формате 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(), как видно из исходного кода .

UPDATE:

Чтобы получить желаемый результат, вы можете создать собственную рекурсивную функцию для сбора всех путей:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...