Hui, sieht sehr elegant aus!
Was ich mit den Daten vorhabe: Ich durchsuche mein Dateisystem. Also sag ich meinem Python-Tool, welche Ordner es rekursiv durchwandern soll. Da mir os.walk() etwas zu stur und unflexibel ist, benötige ich eine eigene walk-Funktion.
Weil ich mehrere Ordner angeben kann, können sich Angaben auch überlagern (es wäre dumm, ist aber theoretisch möglich):
Dasselbe gilt für Symlinks. Um erstens Zeit zu sparen und zweitens Infinite-Loops zu vermeiden (Thema Symlinks), halte ich bereits "besuchte" Dateien und Verzeichnisse in einer Liste fest. Während ich also rekursiv alle Verzeichnisse in
seek durchsuche, muss ich bei jedem einzelnen prüfen, ob ich hier nicht schonmal gewesen bin. Falls ja, spare ich es mir, dasselbe Verzeichnis nochmal zu durchsuchen.
Die Prüfung kostet mich zwar Zeit, aber dafür kann ich auch sehr viel Zeit sparen. Später möchte ich auch angeben können, welche Verzeichnisse von der Suche ausgeschlossen werden sollen. Dafür benötige ich dann sowieso eine Prüfung... also wird sich diese Prüfung später sicher rentieren.
Weil sie aber Zeit kostet, möchte ich die Datenhaltung dabei so effektiv wie möglich halten. Ich hatte bereits erste Versuche, wobei ich jeweils den vollständigen Pfad in einer Liste gespeichert hatte. Bei sehr vielen Dateien werden die Werte der Liste extrem viel:
Code: Alles auswählen
visited = []
visited.append("/foo/file1)
visited.append("/foo/file2)
visited.append("/foo/file3)
visited.append("/foo/bar)
visited.append("/foo/bar/file4)
visited.append("/foo/bar/file5)
visited.append("/foo/bar/file6)
visited.append("/foo/bar/file7)
Letzlich möchte ich die besuchten Dateien und Verzeichnisse als Baum darstellen können, wie bereits richtig vermutet wurde. Daher halte ich eine Datenhaltung diesem Stil hier ganz sinnvoll:
Code: Alles auswählen
id | parent | name
----+--------+------
0 | None | /
1 | 0 | foo
2 | 1 | file1
3 | 1 | file2
4 | 1 | file3
5 | 1 | bar
6 | 5 | file4
7 | 5 | file5
8 | 5 | file6
9 | 5 | file7
Vielleicht möchte ich die später auch so in eine Datenbank eintragen oder als XML-Bericht exportieren.