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"
}
]
}
]
}
]
}
我有一个包含所有文件路径的列表变量。 例如:
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"
}
]
}
]
}
]
}