【问题标题】:How to generate tree structure dictionary for path list in python如何在python中为路径列表生成树结构字典
【发布时间】:2021-12-20 12:31:18
【问题描述】:

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

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"
           }
        ]
     }
  ]
  
}

有没有可用于这种情况的库? 我仍在尝试以这种格式获取输出。 一旦我实现它,我将发布代码sn-p。

还有谁能提出实现这一目标的方法

提前致谢!

【问题讨论】:

标签: python-3.x dictionary directory path tree


【解决方案1】:

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

这里有一些代码:

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"
            }
          ]
        }
      ]
    }
  ]
}

【讨论】:

  • 非常感谢。它有效
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
相关资源
最近更新 更多