2017-05-04 8 views
0

インポートのサポート形式はchild;parentなので、私はディレクトリツリー構造を実装しており、この構造のインポートを "奇妙な方法"でサポートしているひどいシステムで作業しています。 インポート制約:
- 子項目が一意の名前
を持っている必要があります - 親項目が重複している場合、子供が最初の親の下にインポートされますがpythonツリーのディレクトリ一意の名前、ツリーのアルゴリズム

どう
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 

間違った表現を生成するデフォルトのインポートの外観です。私は(システム要件に合うように短い名前など)を一意の文字列で=id +追加の変更をすべてのフォルダの名前を変更することを決定し、この問題に取り組むためにepresentation

root 
|-- A 
| |-- aa 
| | |-- cc 
| | `-- dd 
| `-- bb 
|  |-- FF 
|  `-- ee 
`-- B 
    `-- aa 
     |-- cc 
     `-- dd 

とシステムにインポートしたが、その後、データベースを経由して=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を使いたかったのですが、これを実装するのに助けが必要です。

すべてのヒントを高く評価します。 ありがとう

答えて

0

私は、私はすべてのnodetag, identifier, dataを含めることができるため、treelibを使用 および方法create_from_pathtreelib.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

0

ここでの問題は、お使いのシステムでは、ディレクトリのすべての名前が同じ範囲内にあるように見えることです。これは、フォルダの名前を変更しなければ解決できません。しかし、すべてのフォルダのインデックスを作成するのではなく、名前に親構造をエンコードする方法があります。たとえば、コードは次のようになります。

ただし、ディレクトリ名が実際に長くなる可能性があるため、この方法に問題がある可能性があります。システムにどのようなアクセス権がありますか、それを変更できますか?私はあなたを正しく理解すれば、それはフォルダ構造を作成するために使用されますか?それで、システムは、同じ名前の異なるディレクトリの中に子どもを持つことをサポートしていないようです。 pwdコマンドは、ディレクトリへの絶対パスを与えるので、私が提示したアプローチは、bashを使って(すでに存在するディレクトリ構造から)インポートファイルを生成すると簡単です。

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

はそうあなただけの持っている:あなたは解決策は、各フォルダのノードで辞書を持っているだろう、システムを変更するアクセス権を持っている場合

た後、次のインポートファイルを(名前の衝突を避けるために)と子の名前、そして親の明示的なパス。次に、親ノードを見つけるためにルートから親パスをたどることができます。

+0

がマン、私は前にこのアプローチを試みたが、私は限界にも多くの開発者を見つけありがとうを私に言うことができませんでした..そして、私はこのくそを支える役割を果たしています。 私はtreelibでその方法を見つけました。私は後で解決策を投稿します – oglop

関連する問題