python 树目录唯一名称,树算法
python tree directories unique names, tree algorithms
我正在使用糟糕的系统,它实现了目录树结构并支持在 "strange way" 中导入该结构,因为
导入仅支持格式 child;parent
。
导入限制:
- 子项必须具有唯一名称
- 如果父项重复,子项将在找到的第一个父项下导入
假设要创建的目录结构如下
root
|-- A
| |-- aa
| | |-- cc
| | `-- dd
| `-- bb
| `-- ee
`-- B
|-- aa
| |-- cc
| `-- dd
`-- bb
`-- FF
默认导入看起来如何,它不起作用或产生错误的表示:
child;parent
root
A;root
aa;A
cc;aa
dd;aa
bb;A
ee;bb
B;root
aa;B <-- duplicated child item does not work
cc;aa <-- duplicated entry - system saves it under A instead of under B
dd;aa <-- duplicated entry - system saves it under A instead of under B
bb;B
FF;bb <-- system saves it under A instead of under B
表示错误
root
|-- A
| |-- aa
| | |-- cc
| | `-- dd
| `-- bb
| |-- FF
| `-- ee
`-- B
`-- aa
|-- cc
`-- dd
为了解决这个问题,我决定用唯一的字符串重命名每个文件夹 =id
+ 其他更改(更短的名称等以满足系统要求)
并将其导入系统,然后通过数据库删除 =id
。
然后导入对看起来像:
child;parent
root;
A==1;root=0
aa=2;A=1
cc=3;aa=2
dd=4;aa=2
bb=5;A=1
ee=7;bb=3
B=8;root=0
aa=9;B=8
cc=10;aa=9
dd=11;aa=9
bb=12;B=8
FF=13;bb=12
并且结构符合要求
root=0
|-- A=1
| |-- aa=2
| | |-- cc=3
| | `-- dd=4
| `-- bb=5
| `-- ee=7
`-- B=8
|-- aa=9
| |-- cc=10
| `-- dd=11
`-- bb=12
`-- FF=13
但是我需要使用原始结构而不重命名它。
我有一个想法,我可以使用树数据结构将结构保留在内存中,但我陷入了实施。
我想使用 os.walk('root')
和 treelib
但我需要帮助来实现它。
非常感谢所有提示。
谢谢
所以这里的问题是,在您的系统中,所有目录的名称似乎都在同一范围内。如果不重命名文件夹,这是无法解决的。然而,我的方法不是仅仅索引每个文件夹,而是在名称中编码父结构。对于您的示例,您的代码将如下所示:
child;parent
root
root/A;root
root/A/aa;root/A
root/A/aa/cc;root/A/aa
...
root/B;root
root/B/aa;root/B <-- not duplicated anymore.
...
但是,这种方法可能存在问题,因为目录名称可能会变得很长。您对系统有什么权限,可以修改吗?如果我理解正确的话,它是用来创建文件夹结构的吗?那么系统似乎不支持在不同目录中使用相同名称的子项。如果您使用 bash 生成导入文件(从已经存在的目录结构),我提出的方法很简单,因为命令 pwd
为您提供了目录的绝对路径。
如果您有权修改系统,解决方案是在每个文件夹节点中有一个字典(以避免名称冲突),然后有以下导入文件:
child;parent
root
A;root
aa;root/A
cc;root/A/aa
...
B;root
aa;root/B
...
所以您只有子项的名称,然后是父项中的显式路径。那么就可以直接从根开始沿着父路径遍历找到父节点。
我找到了如何引用原始目录和重命名目录的方法
我使用了 treelib
因为每个 node
都可以包含 tag, identifier, data
,
并通过 create_from_path
.
方法扩展 treelib.Tree
对于此路径:root/A/bb/cc/dd
然后将给定路径 root/A/bb/cc/dd
分成多个部分并访问每个节点 + 如果已经存在则更新:
使用此模板:
treelib.Node(tag=unique_name, identifier=full_path, data=base_name)
root
-> Node(root=1, root, root)
root/A
-> Node(A=2, root/A, A)
root/A/bb
-> Node(bb=3, root/A/bb, bb)
root/A/bb/cc
-> Node(cc=4, root/A/bb/cc, cc)
root/A/bb/cc/dd
-> Node(dd=5, root/A/bb/cc/dd, dd)
然后我可以遍历树并构建所需的路径,例如:
root=1/A=2/bb=3/cc=4/dd=5
我正在使用糟糕的系统,它实现了目录树结构并支持在 "strange way" 中导入该结构,因为
导入仅支持格式 child;parent
。
导入限制:
- 子项必须具有唯一名称
- 如果父项重复,子项将在找到的第一个父项下导入
假设要创建的目录结构如下
root
|-- A
| |-- aa
| | |-- cc
| | `-- dd
| `-- bb
| `-- ee
`-- B
|-- aa
| |-- cc
| `-- dd
`-- bb
`-- FF
默认导入看起来如何,它不起作用或产生错误的表示:
child;parent
root
A;root
aa;A
cc;aa
dd;aa
bb;A
ee;bb
B;root
aa;B <-- duplicated child item does not work
cc;aa <-- duplicated entry - system saves it under A instead of under B
dd;aa <-- duplicated entry - system saves it under A instead of under B
bb;B
FF;bb <-- system saves it under A instead of under B
表示错误
root
|-- A
| |-- aa
| | |-- cc
| | `-- dd
| `-- bb
| |-- FF
| `-- ee
`-- B
`-- aa
|-- cc
`-- dd
为了解决这个问题,我决定用唯一的字符串重命名每个文件夹 =id
+ 其他更改(更短的名称等以满足系统要求)
并将其导入系统,然后通过数据库删除 =id
。
然后导入对看起来像:
child;parent
root;
A==1;root=0
aa=2;A=1
cc=3;aa=2
dd=4;aa=2
bb=5;A=1
ee=7;bb=3
B=8;root=0
aa=9;B=8
cc=10;aa=9
dd=11;aa=9
bb=12;B=8
FF=13;bb=12
并且结构符合要求
root=0
|-- A=1
| |-- aa=2
| | |-- cc=3
| | `-- dd=4
| `-- bb=5
| `-- ee=7
`-- B=8
|-- aa=9
| |-- cc=10
| `-- dd=11
`-- bb=12
`-- FF=13
但是我需要使用原始结构而不重命名它。
我有一个想法,我可以使用树数据结构将结构保留在内存中,但我陷入了实施。
我想使用 os.walk('root')
和 treelib
但我需要帮助来实现它。
非常感谢所有提示。 谢谢
所以这里的问题是,在您的系统中,所有目录的名称似乎都在同一范围内。如果不重命名文件夹,这是无法解决的。然而,我的方法不是仅仅索引每个文件夹,而是在名称中编码父结构。对于您的示例,您的代码将如下所示:
child;parent
root
root/A;root
root/A/aa;root/A
root/A/aa/cc;root/A/aa
...
root/B;root
root/B/aa;root/B <-- not duplicated anymore.
...
但是,这种方法可能存在问题,因为目录名称可能会变得很长。您对系统有什么权限,可以修改吗?如果我理解正确的话,它是用来创建文件夹结构的吗?那么系统似乎不支持在不同目录中使用相同名称的子项。如果您使用 bash 生成导入文件(从已经存在的目录结构),我提出的方法很简单,因为命令 pwd
为您提供了目录的绝对路径。
如果您有权修改系统,解决方案是在每个文件夹节点中有一个字典(以避免名称冲突),然后有以下导入文件:
child;parent
root
A;root
aa;root/A
cc;root/A/aa
...
B;root
aa;root/B
...
所以您只有子项的名称,然后是父项中的显式路径。那么就可以直接从根开始沿着父路径遍历找到父节点。
我找到了如何引用原始目录和重命名目录的方法
我使用了 treelib
因为每个 node
都可以包含 tag, identifier, data
,
并通过 create_from_path
.
方法扩展 treelib.Tree
对于此路径:root/A/bb/cc/dd
然后将给定路径 root/A/bb/cc/dd
分成多个部分并访问每个节点 + 如果已经存在则更新:
使用此模板:
treelib.Node(tag=unique_name, identifier=full_path, data=base_name)
root
-> Node(root=1, root, root)
root/A
-> Node(A=2, root/A, A)
root/A/bb
-> Node(bb=3, root/A/bb, bb)
root/A/bb/cc
-> Node(cc=4, root/A/bb/cc, cc)
root/A/bb/cc/dd
-> Node(dd=5, root/A/bb/cc/dd, dd)
然后我可以遍历树并构建所需的路径,例如:
root=1/A=2/bb=3/cc=4/dd=5