Listet Dateien in einem Ordner als Stream auf, um den Prozess sofort zu starten

8

Ich bekomme einen Ordner mit 1 Million Dateien drin.

Ich möchte sofort mit dem Prozess beginnen, wenn ich Dateien in diesem Ordner, in Python oder anderen Skriptsprachen auflistet.

Die üblichen Funktionen (os.listdir in python ...) blockieren und mein Programm muss auf das Ende der Liste warten, was sehr lange dauern kann.

Wie listet man am besten große Ordner auf?

    
Adrien 09.12.2010, 22:02
quelle

4 Antworten

12

Wenn praktisch, ändern Sie Ihre Verzeichnisstruktur. aber wenn nicht, können Sie ctypes verwenden, um opendir und aufzurufen readdir .

Hier ist eine Kopie dieses Codes; Alles, was ich getan habe, war, es richtig einzurücken, den try/finally -Block hinzuzufügen und einen Fehler zu beheben. Möglicherweise müssen Sie es debuggen. Besonders das Strukturlayout.

Beachten Sie, dass dieser Code nicht tragbar ist. Sie müssten verschiedene Funktionen unter Windows verwenden, und ich denke, die Strukturen variieren von Unix zu Unix.

%Vor%     
Jason Orendorff 09.12.2010 22:22
quelle
3

Das fühlt sich schmutzig an, sollte aber den Trick machen:

%Vor%

Verwendung: listdirx('/something/with/lots/of/files')

    
Cameron Jordan 09.12.2010 22:22
quelle
2

Für Leute, die von Google kommen, hat PEP 471 eine angemessene Lösung für die Standardbibliothek von Python 3.5 hinzugefügt und sie wurde nach Python 2.6+ und 3.2+ als Modul scandir auf PIP zurückportiert.

Quelle: Ссылка

Python 3.5 +:

  • os.walk wurde aktualisiert, um diese Infrastruktur für eine bessere Leistung zu verwenden.
  • os.scandir gibt einen Iterator über DirEntry objects zurück.

Python 2.6 / 2.7 und 3.2 / 3.3 / 3.4:

  • scandir.walk ist eine performantere Version von os.walk
  • scandir.scandir gibt einen Iterator über DirEntry objects zurück.

Die scandir() iterators wrap opendir / readdir auf POSIX-Plattformen und FindFirstFileW / FindNextFileW unter Windows.

Der Rückgabepunkt von DirEntry -Objekten besteht darin, dass Metadaten zwischengespeichert werden, um die Anzahl der Systemaufrufe zu minimieren. (zB. DirEntry.stat(follow_symlinks=False) führt unter Windows niemals einen Systemaufruf durch, weil die Funktionen FindFirstFileW und FindNextFileW kostenlos stat Informationen ausgeben)

Quelle: Ссылка

    
ssokolow 13.05.2016 09:10
quelle
0

Hier ist Ihre Antwort, wie Sie eine große Verzeichnisdatei nach Datei unter Windows durchsuchen können!

Ich habe wie ein Wahnsinniger nach einer Windows-DLL gesucht, die es mir erlaubt, zu tun, was unter Linux gemacht wird, aber kein Glück.

Also kam ich zu dem Schluss, dass die einzige Möglichkeit darin besteht, meine eigene DLL zu erstellen, die diese statischen Funktionen für mich verfügbar macht, aber dann erinnerte ich mich an pywintypes. Und, YEEY! das ist dort schon gemacht. Und, noch mehr, eine Iterator-Funktion ist bereits implementiert! Cool!

Eine Windows DLL mit FindFirstFile (), FindNextFile () und FindClose () ist vielleicht noch irgendwo da, aber ich habe es nicht gefunden. Also habe ich Pywintypen benutzt.

EDIT: Sie haben sich in kernel32.dll versteckt. Bitte siskolows Antwort und meinen Kommentar dazu lesen.

Sorry für die Abhängigkeit. Aber ich denke, dass Sie win32file.pyd aus ... \ site-packages \ win32 Ordner und eventuellen Abhängigkeiten extrahieren und es unabhängig von Win32types mit Ihrem Programm verteilen können, wenn Sie müssen.

Ich habe diese Frage bei der Suche nach diesem und einigen anderen gefunden.

Hier:

Wie kopiere ich die ersten 100 Dateien aus einem Verzeichnis von Tausenden von Dateien mit Python?

Ich habe einen vollständigen Code mit der Linux-Version von listdir () von hier (von Jason Orendorff) gepostet und mit meiner Windows-Version, die ich hier präsentiere.

Wer also eine mehr oder weniger plattformübergreifende Version haben möchte, kann dorthin gehen oder zwei Antworten selbst kombinieren.

BEARBEITEN: Oder noch besser, benutze scandir module oder os.scandir () (in Python 3.5) und folgende Versionen. Es behandelt Fehler und einige andere Sachen besser.

%Vor%     
Dalen 06.08.2015 15:01
quelle

Tags und Links