PeterL hat geschrieben: Montag 14. Februar 2022, 17:31
Wenn ich das Ergebnis mit return zurückgeben will.
Wird mir nur ein Ordner angezeigt. Mein Code:
Code: Alles auswählen
def ordner_unterordner_auslesen(quelle):
for root, dirs, files in os.walk(quelle, topdown=True):
for name in dirs:
datei_pfad=(os.path.join(root,name))
return datei_pfad
Ich habe jetzt nicht alle vorherigen Beiträge gelesen.
Im Endeffekt gibt es zwei Lösungsansätze.
Der erste Ansatz wäre es, eine Liste zu erstellen, die Ergebnisse zur Liste hinzufügen und dann die Liste mit
return zurückgeben.
Der alternative Ansatz ist die Verwendung eines Generators:
Code: Alles auswählen
def ordner_unterordner_auslesen(quelle):
for root, dirs, files in os.walk(quelle, topdown=True):
for name in dirs:
yield os.path.join(root,name)
In den vorherigen Beiträgen ist auch
rglob vorgeschlagen worden, dass die Klasse
Path als Methode anbietet.
Dann wird der Code etwas kürzer und ist besser lesbar.
Code: Alles auswählen
from pathlib import Path
def ordner_unterordner_auslesen(quelle):
for path in Path(quelle).rglob("*"):
if path.is_dir():
yield path
Beide Funktionen sind GeneratorFunktionen und können so verwendet werden:
Code: Alles auswählen
unterordner = list(ordner_unterordner_auslesen("Downloads"))
Der Aufruf der GeneratorFunktion liefert einen Generator zurück.
Der Generator ist dem Namen
gen zugewiesen und es passiert erst mal gar nichts.
Der Generator muss konsumiert werden. Das geht iterativ mit einer for-Schleife oder z.B. mit Typen, die ein iterierbare Objekte erwarten (list, tuple, set, frosenset, usw..)
Code: Alles auswählen
# Generator konsumieren
ergebnis = list(gen)
ergebnis2 = list(gen)
# ergebnis2 = [ ]
# liegt daran, dass der Generator bereits verbraucht ist
Die Verwendung eines Generators hat unter anderem den Vorteil, dass außerhalb der GeneratorFunktion bestimmt wird, in welcher Form die Ergebnisse gesammelt werden.