Разобрать текстовое (или ASCII) дерево каталогов для объекта Python - PullRequest
0 голосов
/ 19 февраля 2019

Это более или менее обратный вопрос к Список структуры дерева каталогов в python? и этот ответ https://stackoverflow.com/a/51991554/7422721

Учитывая, что у нас есть дерево каталогов стиля художественного текста (ASCII(но не ограничиваясь ими), сгенерированный как вывод программы tree или эквивалентного сценария Python:

a/
├── b/
│   └── c/
│       ├── file_1
│       └── file_2
└── d/

Каждое имя файла заканчивается одним из '/', '=', '*', '@', '|' or '>', указывающим тип файла, как и ls -F или tree -F конвенция.Таким образом, имя файла, оканчивающееся на /, будет каталогом, = для сокета и т. Д. Если нет конца, мы предполагаем, что это обычный файл.

Как я могу прочитать это обратно в собственную структуру данных,например:

[
  "a": [
    "b": [
      "c": [
        "file_1", "file_2"
      ]
    ],
    "d": []
  ]
]  

Или к другому объекту, который может быть представлен в файловой системе памяти?

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

1 Ответ

0 голосов
/ 20 февраля 2019

Мне удалось преобразовать пример дерева из вашего вопроса в формат dict:

{'a': {'b': {'c': {'file_1': {}, 'file_2': {}}}, 'd': {}}}

Сценарий:

import re

def find_children(tree):
    result = {}
    for i, line in enumerate(tree.split('\n')):
        child = re.findall('^\w+', line)
        if child:
            parent = child[0]
            child_tree = '\n'.join([x[len(parent)+3:] for x in tree.split('\n')[i+1:]])
            result[parent] = find_children(child_tree)
    return result

with open('tree.txt', 'r', encoding='utf-8') as f:
    tree_dict = find_children(f.read())
...