python树目录唯一名称,树算法

时间:2017-05-04 07:47:24

标签: python algorithm tree directory-traversal

我正在使用可怕的系统,它实现了目录树结构并支持以“奇怪的方式”导入此结构,因为 导入支持仅格式为/recipes。 进口限制:
- 子项必须具有唯一的名称
- 如果父项是重复的,则在找到的第一个父项下导入子项

假设要创建以下目录结构

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'),但我需要帮助实现此功能。

所有提示高度赞赏。 谢谢

2 个答案:

答案 0 :(得分:0)

所以这里的问题是在你的系统中,目录的所有名称似乎都在同一范围内。如果不重命名文件夹,这是不可解决的。然而,不是仅仅索引每个文件夹,而是我的方法是在名称中对父结构进行编码。对于您的示例,您的代码看起来像这样:

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为您提供了目录的绝对路径。

如果您有权修改系统,解决方案是在每个文件夹节点中设置一个dict(以避免名称冲突),然后使用以下导入文件:

child;parent
root
A;root
aa;root/A
cc;root/A/aa
...
B;root
aa;root/B
...

所以你只有孩子的名字,然后是父母的显式路径。然后,您可以从根路径遍历父路径以查找父节点。

答案 1 :(得分:0)

我找到了如何获取原始和重命名目录的引用

的方法

我使用了treelib,因为每个node都可以包含tag, identifier, data, 并按方法treelib.Tree扩展create_from_path 对于此路径:root/A/bb/cc/dd

然后将给定路径root/A/bb/cc/dd分成几部分并访问每个节点+更新(如果已存在): 使用此模板:
treelib.Node(tag=unique_name, identifier=full_path, data=base_name)

root - &gt; Node(root=1, root, root)
root/A - &gt; Node(A=2, root/A, A)
root/A/bb - &gt; Node(bb=3, root/A/bb, bb)
root/A/bb/cc - &GT; Node(cc=4, root/A/bb/cc, cc)
root/A/bb/cc/dd - &gt; Node(dd=5, root/A/bb/cc/dd, dd)

然后我可以遍历树并构建所需的路径,如: root=1/A=2/bb=3/cc=4/dd=5