Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
die Funktion sollte sich eigentlich schon beenden, nur du bekommst keinen Wert zurück. Wenn du auf ein Verzeichnis stößt, dann wertest du nicht aus, ob in diesem Verzeichnis die gesuchte Datei steckt; du rufst die suche-Funktion lediglich auf.
import glob, os
def suche(path, filename):
dateien = glob.glob(path + os.sep + '*')
for a in dateien:
if(os.path.isdir(a)):
value = suche(a, filename)
if value:
return value
else:
datei = a
dateiname = a.split(os.sep)[-1]
if(dateiname == filename):
return a
suche("M:", "HelloWorld.txt")
os.walk existiert, es besteht kein Grund, die Rekursion eigenhändig zu schreiben. Ebenso gibt es os.path.basename, man muss Dateinamen also auch nicht eigenhändig splitten.
def find_all_files(path, filename):
"""Iterates over all files with `filename` in `path`"""
for root, directories, files in os.walk(path):
for match in (os.path.join(root, f) for f in files if f == filename):
yield match
for match in find_all_files('/home/foo', 'myfile'):
print match
Ich finde die for-Schleifen in Python ja echt interessant, was man da so alles reinpacken kann. Leider versteh ich die meistens nicht
Was macht denn die Zeile
Zizibee hat geschrieben:Ich finde die for-Schleifen in Python ja echt interessant, was man da so alles reinpacken kann. Leider versteh ich die meistens nicht
Was macht denn die Zeile
for match in (os.path.join(root, f) for f in files if f == filename):
?
Der geklammerte Ausruck ist eine Generator Expression. Dieser Ausdruck funktioniert genauso wie eine LC, mit dem Unterschied, dass eine LC eine Liste erzeugt, während dieser Ausdruck ein Generator-Objekt erstellt (wie eine Funktion, die das yield Statement enthält).
In ``for``-Schleifen kann man eigentlich nur "iterables" reinpacken. In diesem Fall ist es ein Generator-Ausdruck. Ist im Grunde wie eine "list comprehension" mit runden statt eckigen Klammern nur das nicht erst die ganze Liste auf einmal aufgebaut wird, sondern die Elemente der Reihe nach erzeugt und dann in der Schleife verarbeitet werden.
Der Generator-Ausdruck lässt es sich hier recht einfach "lesen":
(os.path.join(root, f) for f in files if f == filename)
Verbinde die Pfade `root` und `f` für jedes `f` aus `files` wenn `f` == `filename` ist.