2017-05-04 3 views
0

Ich arbeite mit schrecklichen System, das Verzeichnisbaumstruktur implementiert hat und den Import dieser Struktur auf eine "seltsame Art und Weise" unterstützt, weil Import nur Format child;parent importieren. Import Einschränkungen:
- Kind Einzelteile müssen eindeutige Namen haben
- wenn übergeordnetes Element dupliziert wird, wird Kind unter erst Eltern importiert gefundenPython Tree Verzeichnisse eindeutige Namen, Baum-Algorithmen

folgende Struktur von Verzeichnissen annehmen zu müssen

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

erstellt Wie würde standardmäßig importieren aussehen, was nicht funktioniert oder falsche Darstellung erzeugt:

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 

Falsch r ePresentation

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

Um dieses Problem zu bewältigen entschied ich mich jeden Ordner mit eindeutigem String =id + zusätzlichen Änderungen umbenennen (kürzeren Namen, etc. Systemanforderungen passen) und importierte sie in ein System, entfernt dann =id über Datenbank.
dann sieht Import Paare wie:

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 

Und die Struktur als

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 

gewünscht ist aber ich muss arbeiten müssen ohne Umbenennung mit ursprünglichen Struktur arbeiten.
Ich hatte eine Idee, dass ich die Struktur nur im Speicher behalten konnte, indem ich Baumstruktur verwendete, aber ich steckte in der Implementierung fest.

Ich wollte os.walk('root') und treelib verwenden, aber ich brauche Hilfe bei der Umsetzung dieser.

Alle Tipps sehr geschätzt. Vielen Dank

Antwort

0

fand ich die Art und Weise, wie Referenzen für Original und umbenannt Verzeichnisse

ich die treelib verwendet haben, weil jeder nodetag, identifier, data, und treelib.Treecreate_from_path durch Verfahren erweitert enthalten.
für diesen Pfad: root/A/bb/cc/dd

gespalten Dann den angegebenen Pfad root/A/bb/cc/dd in Abschnitte und jeden Knoten besuchen + aktualisieren, wenn bereits vorhanden ist: diese Vorlage:
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)

Dann konnte ich durch den Baum durchqueren und die gewünschten Pfade wie bauen: root=1/A=2/bb=3/cc=4/dd=5

0

Also das Problem hier ist, dass in Ihrem System alle Namen der Verzeichnisse im gleichen Umfang zu sein scheinen. Dies ist nicht lösbar, ohne die Ordner umzubenennen. Anstatt jedoch nur jeden Ordner zu indizieren, würde mein Ansatz darin bestehen, die Elternstruktur im Namen zu codieren. Für Ihr Beispiel würde der Code wie folgt aussehen:

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. 
... 

Allerdings könnte es Probleme mit diesem Ansatz, da Verzeichnisnamen wirklich lang werden können. Welchen Zugriff haben Sie auf das System? Können Sie es ändern? Wenn ich Sie richtig verstehe, wird es verwendet, um eine Ordnerstruktur zu erstellen? Dann scheint es, dass das System keine Kinder in verschiedenen Verzeichnissen mit demselben Namen unterstützt. Mein vorgestellter Ansatz ist einfach, wenn Sie bash verwenden, um die Importdatei (aus einer bereits vorhandenen Verzeichnisstruktur) zu generieren, da der Befehl pwd Ihnen den absoluten Pfad zu einem Verzeichnis gibt.

Wenn Sie Zugriff haben, das System zu ändern, eine Lösung, die einen dict wäre in jedem Ordner Knoten haben (um Namenskollisionen zu vermeiden) und dann die folgende Importdatei mit:

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

so müssen Sie nur noch die Name des Kindes und dann der explizite Pfad im Elternteil.Dann können Sie einfach den übergeordneten Pfad von der Wurzel aus durchlaufen, um den übergeordneten Knoten zu finden.

+0

Danke Mans, ich diesen Ansatz versucht haben, bevor aber ich viele Grenzen gefunden, die auch Entwickler Ich konnte es mir nicht sagen. Und ich unterstütze diesen Mist. Ich fand das wie es mit treelib, ich werde meine Lösung später veröffentlichen – oglop

Verwandte Themen