Ich habe eine Datei, die sich möglicherweise an einer anderen Stelle auf dem Computer jedes Benutzers befindet. Gibt es eine Möglichkeit, eine Suche nach der Datei durchzuführen? Eine Möglichkeit, den Dateinamen und den Verzeichnisbaum für die Suche zu übergeben?
109
Antworten:
os.walk ist die Antwort, dies wird die erste Übereinstimmung finden:
Und das findet alle Übereinstimmungen:
Und das passt zu einem Muster:
quelle
if name in file or name in dirs
for name in files:
wird nicht suchen,super-photo.jpg
wenn essuper-photo.JPG
im Dateisystem ist. (eine Stunde meines Lebens würde ich gerne zurück ;-) Etwas chaotisch istif str.lower(name) in [x.lower() for x in files]
Ich habe eine Version von
os.walk
und in einem größeren Verzeichnis mal ca. 3,5 sek bekommen. Ich habe zwei zufällige Lösungen ohne große Verbesserung ausprobiert und dann einfach:Während es nur POSIX ist, habe ich 0,25 Sekunden.
Aus diesem Grund glaube ich, dass es durchaus möglich ist, die gesamte Suche plattformunabhängig zu optimieren, aber hier habe ich die Forschung eingestellt.
quelle
Wenn Sie Python unter Ubuntu verwenden und nur möchten, dass es unter Ubuntu wesentlich schneller funktioniert, verwenden Sie das
locate
Programm des Terminals wie folgt .search_results
ist einerlist
der absoluten Dateipfade. Dies ist 10.000 Mal schneller als die oben genannten Methoden und für eine Suche, die ich durchgeführt habe, war es ~ 72.000 Mal schneller.quelle
In Python 3.4 oder neuer können Sie pathlib verwenden, um rekursives Globbing durchzuführen:
Referenz: https://docs.python.org/3/library/pathlib.html#pathlib.Path.glob
In Python 3.5 oder neuer können Sie auch rekursives Globbing wie folgt ausführen:
Referenz: https://docs.python.org/3/library/glob.html#glob.glob
quelle
Verwenden Sie für eine schnelle, betriebssystemunabhängige Suche
scandir
https://github.com/benhoyt/scandir/#readme
Lesen Sie http://bugs.python.org/issue11406, um zu erfahren, warum.
quelle
scandir.walk()
die Antwort von @ Nadia. Beachten Sie, dass bei Verwendung von Python 3.5+os.walk()
diescandir.walk()
Beschleunigung bereits vorhanden ist. Außerdem ist PEP 471 wahrscheinlich ein besseres Dokument zum Lesen als dieses Problem.Wenn Sie mit Python 2 arbeiten, haben Sie ein Problem mit der unendlichen Rekursion unter Windows, das durch selbstreferenzierende Symlinks verursacht wird.
Dieses Skript vermeidet es, diesen zu folgen. Beachten Sie, dass dies Windows-spezifisch ist !
Es wird eine Liste mit allen Pfaden zurückgegeben, die auf Dateien in der Dateinamenliste verweisen. Verwendung:
quelle
Im Folgenden verwenden wir ein boolesches Argument "first", um zwischen der ersten Übereinstimmung und allen Übereinstimmungen zu wechseln (eine Standardeinstellung, die "find. -Name file" entspricht):
quelle
Die Antwort ist den bestehenden sehr ähnlich, aber leicht optimiert.
So können Sie alle Dateien oder Ordner nach Muster finden:
entweder durch Teilzeichenfolge:
oder mit einem Prädikat:
Um nur Dateien oder nur Ordner zu durchsuchen, ersetzen Sie "dirs + files" beispielsweise durch "dirs" oder nur "files", je nachdem, was Sie benötigen.
Grüße.
quelle