Walking/Iteration über ein verschachteltes dictionary beliebiger Tiefe (das Wörterbuch stellt einen Verzeichnis-Baum)
Ich bin mir fast sicher es gibt eine einfache Lösung für dieses, aber ich habe Stunden damit zugebracht haben, jetzt das Lesen und Wiederlesen der gleichen Gruppe von verwandten Ergebnissen, die nicht ganz die Antwort mein problem.
Zusammenhang mit dieser Frage (im Lieferumfang enthalten, ist für den Abschluss, aber fühlen Sie sich frei, zu überspringen)
Dies kam, weil ich ein Benutzer in der Lage sein, wählen Sie eine Gruppe von Dateien in einem Verzeichnis (und auch jedem Unterverzeichnis), und leider Tkinter Standard-Fähigkeit für die Auswahl mehrerer Dateien im dialog Datei defekt ist auf Windows 7 (http://bugs.python.org/issue8010).
So, ich bin versucht zu repräsentieren, eine Verzeichnis-Struktur durch eine alternative Methode (immer noch mit Tkinter): konstruieren eines Faksimile der directory-Struktur, hergestellt, gekennzeichnet und eingerückt Checkboxen (organisiert in einem Baum). Damit ein Verzeichnis wie dieses:
\SomeRootDirectory
\foo.txt
\bar.txt
\Stories
\Horror
\scary.txt
\Trash
\notscary.txt
\Cyberpunk
\Poems
\doyoureadme.txt
wird in etwa so Aussehen (wobei # für ein checkbutton):
SomeRootDirectory
# foo.txt
# bar.txt
Stories
Horror
# scary.txt
Trash
# notscary.txt
Cyberpunk
Poems
# doyoureadme.txt
Gebäude das ursprüngliche Wörterbuch, aus der Verzeichnis-Struktur ist einfach, mit einem Rezept fand ich bei ActiveState (siehe unten), aber ich traf eine Wand, wenn ich versuche zu iterieren über die schön verschachtelten dictionary bin ich Links mit. Und ich glaube, ich muss Durchlaufen, um füllen Sie eine Tkinter-Rahmen mit einer ziemlich gerasterte Darstellung des Baumes. Dann hoffe ich die Last in den verschiedenen text-Dateien, die der Benutzer ausgewählt, durch die Interpretation, die Checkboxen waren true oder false. Alles scheint ziemlich einfach, mit Ausnahme der Iteration über das Wörterbuch ohne Befestigung der Tiefe.
In abstrakteren Begriffen
Machen diese verschachtelten dictionaries bin ich mit einer ActiveState-Rezept -- http://code.activestate.com/recipes/577879/. Es setzt os.Spaziergang zu machen-Wörterbücher wie diese:
a={
'SomeRootDirectory': {
'foo.txt': None,
'bar.txt': None,
'Stories': {
'Horror': {
'horror.txt' : None,
'Trash' : {
'notscary.txt' : None,
},
},
'Cyberpunk' : None
},
'Poems' : {
'doyoureadme.txt' : None
}
}
}
Nach dem Punkt bin ich ratlos. Ich bin ein Python Neuling zum Zeitpunkt des Schreibens
Angepasste Lösung aus spicavigo Antwort
#distinguish between directory and file
dirtab = "/==="
filetab = "|---"
Parents={ -1:"Root"}
def add_dir(level, parent, index, k):
print (dirtab*level)+k
def add_file(level, parent, index, k):
#Currently an empty folder gets passed to add_file; here's a quick treatment.
if "." in k:
print (filetab*level)+k
else:
print (dirtab*level)+k
def addemup(level=0, parent=-1, index=0, di={}):
for k in di:
index +=1
if di[k]:
Parents[index]=k
add_dir(level, parent, index, k)
addemup(level+1, index, index, di[k])
else:
add_file(level, parent, index, k)
addemup(di=a) #dictionary from above
Dadurch entsteht etwas, dass ich denke, dass wird sehr leicht zu überarbeiten, in ein Tkinter-Darstellung:
SomeRootDirectory
/===Poems
|--- | ---doyoureadme.txt
/===Stories
/===/===Horror
|--- | --- | ---rickscott.txt
/===/===/===Trash
|--- | --- | --- | ---notscary.txt
/===/===Cyberpunk
|---foo.txt
|---bar.txt
Dank, dieser Gemeinschaft ist unglaublich.
- wenn Sie Durchlaufen Wörterbuch-Schlüssel-Wert-Paare (innerhalb einer Funktion, die dictionary als argument), können Sie prüfen, ob der Wert eines dictionary-Typs, wenn ja, dann rufen Sie Ihre Funktion wieder verwenden, d.h. die Rekursion hier und pass den Wert als ein Wörterbuch, um die Funktion, andere Prozess den Wert.. dies sollte zu lösen die variable Tiefe iteration problem
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein vorläufiger code. Gehen Sie es durch und sagen Sie mir, wo Sie Probleme haben.
Hier ist eine Funktion, druckt alle Ihre Datei-Namen. Es geht durch alle Schlüssel im Wörterbuch, und wenn Sie Karte, um die Dinge, die nicht Wörterbücher (in deinem Fall der Dateiname), wir drucken die Namen. Ansonsten rufen wir die Funktion auf das Lexikon zugeordnet ist.
Also dieser code kann geändert werden, um zu tun, was Sie wollen, aber es ist nur ein Beispiel, wie Sie können, vermeiden Sie die Festlegung der Tiefe durch die Verwendung von Rekursion.
Die wichtige Sache zu verstehen ist, dass jedes mal, wenn print_all_files aufgerufen wird, hat es keine Kenntnis davon, wie tief es ist in den Baum. Sieht es nur an den Dateien, dass sind genau dort, und druckt den Namen. Wenn es Verzeichnisse, läuft es einfach in sich auf.
Ich weiß, das ist eine alte Frage, aber ich war gerade auf der Suche nach einem einfachen, sauberen Weg zu gehen verschachtelte dicts-und dies ist die nächste Sache, die mein begrenzt die Suche hat mit zu kommen. oadams' Antwort ist nicht nützlich genug, wenn Sie mehr wollen als nur Dateinamen und spicavigo Antwort sieht kompliziert aus.
Landete ich nur Rollen, meine eigene, die wirkt ähnlich wie die os.zu Fuss behandelt-Verzeichnisse, außer dass es gibt alle Schlüssel/Wert-Informationen.
Es gibt einen iterator und für jedes Verzeichnis, in dem "Baum" von geschachtelten dicts, den iterator zurückgegeben (Pfad, sub-dicts, Werte) wo:
Hier ist der code, den ich verwendet, um es zu testen, aber es hat ein paar andere nicht (aber saubere) Sachen in es:
Die Ausgabe sieht so aus:
Können Sie zu Fuß ein verschachteltes dictionary mit Rekursion
Hoffe, das hilft 🙂