Aus dem Python-Dokument gibt os.listdir()
eine Liste mit den Namen der Einträge im Verzeichnis von Pfad. Die Liste ist in beliebiger Reihenfolge.
Was ich mich frage ist, ist diese willkürliche Reihenfolge immer die gleiche / deterministisch? (von einer Maschine zur anderen oder durch die Zeit, vorausgesetzt der Inhalt des Ordners ist der gleiche)
Edit: Ich versuche nicht, es deterministisch zu machen, noch möchte ich das verwenden. Ich habe mich nur gewundert (zum Beispiel, von was hängt die Reihenfolge ab?)
Um zu verstehen, was vor sich geht, können wir die zugrundeliegende Implementierung für python 3.2 überprüfen, die sich hier .
Wir konzentrieren uns auf den POSIX Teil, der in der Zeile 2574 . Im Code sind definiert:
%Vor% Es gibt zwei wichtige POSIX-Aufrufe: opendir
in der Zeile 2596 und readdir
in Zeile 2611 .
Wie Sie auf der Manpage readdir
lesen können:
Die Funktion readdir () gibt einen Zeiger auf eine Dirent-Struktur zurück, die den nächsten Verzeichniseintrag im Verzeichnisstrom darstellt, auf den dirp zeigt. Wenn das Ende des Verzeichnisdatenstroms erreicht wird oder ein Fehler aufgetreten ist, wird NULL zurückgegeben.
Also liest readdir
den nächsten Eintrag im Verzeichnis, aber es hängt vom Dateisystem ab Implementierung um zu definieren, was ist das nächste . Sie können mehr zu diesem Thema hier lesen:
[...] Da es sich um eine pro-Dateisystem-Sache handelt, kann die Traversierungsreihenfolge für verschiedene Verzeichnisse auf demselben System unterschiedlich sein, auch wenn sie dieselben Einträge in der gleichen Reihenfolge haben weil die Verzeichnisse unterschiedliche Dateisystemtypen verwenden oder weil einige Parameter in den verschiedenen Dateisystemen unterschiedlich gesetzt sind.
Sie können sich den Link in den Kommentaren von @Hamish ansehen, der ein wenig in Pythons Hooks in UNIX eingräbt ' opendir
und readdir
Implementierungen, von denen Sie tiefer in Dateisysteme und wie Verzeichnisdatenstrukturen gespeichert werden müssen ...
Die kurze Version ist jedoch trivial einfach: Das zugrundeliegende Dateisystem speichert keine Verzeichniseinträge, geordnet nach Dateinamen. Es geht darum, die Verzeichniseinträge sauber und konsistent zu halten, Dateinamen sind nur ein beliebiges Label, das jedem Eintrag zugeordnet ist und für die Kernfunktion des Dateisystems irrelevant ist. Sich um die lesbaren Beschriftungen zu kümmern, die jedem Verzeichniseintrag zugeordnet sind, erfolgt auf einer höheren Ebene, beispielsweise in Ihrem Python-Code.
Ja, es ist deterministisch, es ist sicherlich nicht absichtlich randomisiert . Der Determinismus liegt jedoch irgendwo tief in den Details der Dateisystemimplementierung, und die lexikalische Reihenfolge der Dateinamen spielt dabei keine Rolle.
Es hängt wahrscheinlich von den Dateisystem-Interna ab. Auf einer typischen Unix-Maschine würde ich erwarten, dass die Reihenfolge der Elemente im Rückgabewert von os.listdir
in der Reihenfolge der Details in der "dirent" -Datenstruktur des Verzeichnisses liegt (was wiederum von den Besonderheiten des Dateisystems abhängt) ).
Ich würde nicht erwarten, dass ein Verzeichnis im Laufe der Zeit die gleiche Reihenfolge hat, wenn Dateien hinzugefügt und gelöscht werden.
Ich würde nicht erwarten, dass zwei "Verzeichnisse mit dem gleichen Inhalt" auf zwei verschiedenen Maschinen eine konsistente Reihenfolge haben, wenn beim Kopieren von einem zum anderen keine besondere Sorgfalt angewandt wird.
Abhängig von einer Vielzahl von Besonderheiten kann sich die Reihenfolge auf einer einzelnen Maschine im Laufe der Zeit ohne explizite Änderungen am Verzeichnis ändern, da verschiedene Dateikomprimierungsvorgänge stattfinden (obwohl ich glaube, dass ich keine gesehen habe) Dateisystem, das dies tatsächlich tun würde, aber es ist definitiv etwas, das getan werden könnte).
Kurz gesagt, wenn Sie irgendeine Art von Bestellung haben wollen, können Sie darüber nachdenken, sortieren Sie die Ergebnisse irgendwie. Dann haben Sie die Garantie, dass die Bestellung unabhängig von Ihrer Sortierung erfolgt.
Tags und Links python