python 如何为路径列表生成树结构字典

How to generate tree structure dictionary for path list in python

我有一个包含所有文件路径的列表变量。 例如:

f_list=[
  "folder1 /folder1.1/images/image1.png",
  "folder1 /folder1.1/images/image2.png",
  "folder1 /folder1.1/images/image5.png",
  "folder1 /folder1.3/Invoice_1.pdf",
  "folder1 /folder1.3/Invoice_2.pdf",
  "folder1 /folder1.3/Invoice_3.pdf",
  "folder1 /folder1.3/Invoice_4.pdf",
  "folder1 /folder1.3/Invoice_5.pdf"
   ]   

我正在尝试从上面的列表生成字典,例如:

{
  "object_name":"",
  "object_type":"folder",
  "object_path":"",
  "object_count":8,
  "object_list":[
     {
        "object_path":"folder1 /folder1.1/images",
        "object_type":"folder",
        "object_count":3,
        "object_list":[
           {
              "object_path":"folder1 /folder1.1/images/image1.png",
              "object_name":"image1.png",
              "object_type":"file"
           },
           {
              "object_path":"folder1 /folder1.1/images/image2.png",
              "object_name":"image2.png",
              "object_type":"file"
           },
           {
              "object_path":"folder1 /folder1.1/images/image5.png",
              "object_name":"image5.png",
              "object_type":"file"
           }
        ]
     },
     {
        "object_path":"folder1 /folder1.3",
        "object_type":"folder",
        "object_count":5,
        "object_list":[
           {
              "object_path":"folder1 /folder1.3/Invoice_1.pdf",
              "object_name":"Invoice_1.pdf",
              "object_type":"file"
           },
           {
              "object_path":"folder1 /folder1.3/Invoice_2.pdf",
              "object_name":"Invoice_2.pdf",
              "object_type":"file"
           },
           {
              "object_path":"folder1 /folder1.3/Invoice_3.pdf",
              "object_name":"Invoice_3.pdf",
              "object_type":"file"
           },
           {
              "object_path":"folder1 /folder1.3/Invoice_4.pdf",
              "object_name":"Invoice_4.pdf",
              "object_type":"file"
           },
           {
              "object_path":"folder1 /folder1.3/Invoice_5.pdf",
              "object_name":"Invoice_5.pdf",
              "object_type":"file"
           }
        ]
     }
  ]
  
}

有没有适合这种情况的库? 我仍在尝试以这种格式获取输出。 一旦实现,我将 post 代码片段。

还有谁能提出实现这个的方法

提前致谢!

您可以使用以路径为键的辅助字典来记住您创建的节点,这样您就可以将一个子节点放入父节点的子节点列表中。

这是一些代码:

def maketree(lst):
    mapper = {}
    for path in lst:
        parent = None
        for key in (path[:i] for i, c in enumerate(path) if i == 0 or c == "/"):
            if key not in mapper:
                node = {
                    "object_type": "folder",
                    "object_path": key,
                    "object_count": 0,
                    "object_list": []
                }
                mapper[key] = node
                if key:
                    mapper[parent]["object_list"].append(node)
            mapper[key]["object_count"] += 1
            parent = key
        node = {
            "object_type": "file",
            "object_path": path,
            "object_name": path[(len(key) or -1) + 1:]
        }
        mapper[path] = node
        mapper[parent]["object_list"].append(node)
    return mapper[""]

您可以按如下方式使用:

# Example run
f_list = [
    "folder1 /folder1.1/images/image1.png",
    "folder1 /folder1.1/images/image2.png",
    "folder1 /folder1.1/images/image5.png",
    "folder1 /folder1.3/Invoice_1.pdf",
    "folder1 /folder1.3/Invoice_2.pdf",
    "folder1 /folder1.3/Invoice_3.pdf",
    "folder1 /folder1.3/Invoice_4.pdf",
    "folder1 /folder1.3/Invoice_5.pdf"
]   

tree = maketree(f_list)

# Pretty print the tree
import json
print(json.dumps(tree, indent=2))

这将产生比您在问题中拥有的更多的关卡,因为还为 folder1 folder1 /folder1.1 创建了一个关卡。我认为这更一致:

{
  "object_type": "folder",
  "object_path": "",
  "object_count": 8,
  "object_list": [
    {
      "object_type": "folder",
      "object_path": "folder1 ",
      "object_count": 8,
      "object_list": [
        {
          "object_type": "folder",
          "object_path": "folder1 /folder1.1",
          "object_count": 3,
          "object_list": [
            {
              "object_type": "folder",
              "object_path": "folder1 /folder1.1/images",
              "object_count": 3,
              "object_list": [
                {
                  "object_type": "file",
                  "object_path": "folder1 /folder1.1/images/image1.png",
                  "object_name": "image1.png"
                },
                {
                  "object_type": "file",
                  "object_path": "folder1 /folder1.1/images/image2.png",
                  "object_name": "image2.png"
                },
                {
                  "object_type": "file",
                  "object_path": "folder1 /folder1.1/images/image5.png",
                  "object_name": "image5.png"
                }
              ]
            }
          ]
        },
        {
          "object_type": "folder",
          "object_path": "folder1 /folder1.3",
          "object_count": 5,
          "object_list": [
            {
              "object_type": "file",
              "object_path": "folder1 /folder1.3/Invoice_1.pdf",
              "object_name": "Invoice_1.pdf"
            },
            {
              "object_type": "file",
              "object_path": "folder1 /folder1.3/Invoice_2.pdf",
              "object_name": "Invoice_2.pdf"
            },
            {
              "object_type": "file",
              "object_path": "folder1 /folder1.3/Invoice_3.pdf",
              "object_name": "Invoice_3.pdf"
            },
            {
              "object_type": "file",
              "object_path": "folder1 /folder1.3/Invoice_4.pdf",
              "object_name": "Invoice_4.pdf"
            },
            {
              "object_type": "file",
              "object_path": "folder1 /folder1.3/Invoice_5.pdf",
              "object_name": "Invoice_5.pdf"
            }
          ]
        }
      ]
    }
  ]
}