将文本(或ASCII)目录树解析为Python对象

问题描述 投票:0回答:1

这或多或少是对List directory tree structure in python?和这个答案https://stackoverflow.com/a/51991554/7422721的反向问题

鉴于我们有文本艺术风格目录树(ASCII,但不限于),生成为tree程序或等效Python脚本的输出:

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

每个文件名以'/', '=', '*', '@', '|' or '>'中的一个指示文件类型结束,与ls -Ftree -F约定一样。因此,以/结尾的文件名将是目录,=用于套接字等。如果没有结尾,我们假设它是常规文件。

如何将其读回原生数据结构,例如:

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

或者可以在内存文件系统中表示的其他对象?

这里的目标是为操作磁盘上文件的脚本创建可读单元测试。

python tree filesystems
1个回答
0
投票

我能够将您的问题中的样本树转换为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())
© www.soinside.com 2019 - 2024. All rights reserved.