Ich benutze oft Python, um Datenverzeichnisse zu verarbeiten. Kürzlich habe ich festgestellt, dass sich die Standardreihenfolge der Listen in etwas fast Unsinniges geändert hat. Wenn ich mich beispielsweise in einem aktuellen Verzeichnis befinde, das die folgenden Unterverzeichnisse enthält: run01, run02, ... run19, run20, und dann generiere ich eine Liste mit dem folgenden Befehl:
dir = os.listdir(os.getcwd())
dann bekomme ich normalerweise eine Liste in dieser Reihenfolge:
dir = ['run01', 'run18', 'run14', 'run13', 'run12', 'run11', 'run08', ... ]
und so weiter. Die Reihenfolge war früher alphanumerisch. Aber diese neue Ordnung ist mir schon eine Weile geblieben.
Was bestimmt die (angezeigte) Reihenfolge dieser Listen?
python
list
directory-listing
listdir
marshall.ward
quelle
quelle
listdir
Ausgabe anfordert . Ich bin nicht sicher, warum die Fragen zusammengeführt wurden.Antworten:
Ich denke, die Reihenfolge hat mit der Art und Weise zu tun, wie die Dateien in Ihrem Dateisystem indiziert werden. Wenn Sie wirklich möchten, dass die Reihenfolge eingehalten wird, können Sie die Liste nach dem Abrufen der Dateien jederzeit sortieren.
quelle
Sie können die integrierte
sorted
Funktion verwenden, um die Zeichenfolgen nach Ihren Wünschen zu sortieren. Basierend auf dem, was Sie beschreiben,Alternativ können Sie die
.sort
Methode einer Liste verwenden:Ich denke, sollte den Trick tun.
Beachten Sie, dass die Reihenfolge, in
os.listdir
der die Dateinamen abgerufen werden, wahrscheinlich vollständig von Ihrem Dateisystem abhängt.quelle
sorted(listdir)
für mich gearbeitet.listdir.sort()
gab mir: TypeError: 'NoneType' Objekt ist nicht iterierbarreverse=True
, um es absteigend zu sortieren.sorted
zuerst geschriebene Ding es in einer einzigen Zeile macht OK?Gemäß der Dokumentation :
Auf die Reihenfolge kann man sich nicht verlassen und sie ist ein Artefakt des Dateisystems.
Verwenden Sie zum Sortieren des Ergebnisses
sorted(os.listdir(path))
.quelle
Python verfügt aus irgendeinem Grund nicht über eine integrierte Methode für eine natürliche Sortierung (dh 1, 2, 10 anstelle von 1, 10, 2). Sie müssen es also selbst schreiben:
Mit dieser Funktion können Sie jetzt eine Liste sortieren:
PROBLEME: Wenn Sie die obige Funktion zum Sortieren von Zeichenfolgen (z. B. Ordnernamen) verwenden und möchten, dass diese wie im Windows Explorer sortiert werden, funktioniert dies in einigen Randfällen nicht ordnungsgemäß.
Diese Sortierfunktion gibt unter Windows falsche Ergebnisse zurück, wenn Sie Ordnernamen mit bestimmten Sonderzeichen enthalten. Diese Funktion wird beispielsweise sortiert
1, !1, !a, a
, während der Windows Explorer sortiert!1, 1, !a, a
.Wenn Sie also genau wie Windows Explorer in Python sortieren möchten, müssen Sie die in Windows integrierte Funktion StrCmpLogicalW über ctypes verwenden (dies funktioniert natürlich nicht unter Unix):
Diese Funktion ist etwas langsamer als
sorted_alphanumeric()
.Bonus:
winsort
Kann auch vollständige Pfade unter Windows sortieren .Alternativ, insbesondere wenn Sie Unix verwenden, können Sie die
natsort
Bibliothek verwenden (pip install natsort
) verwenden, um nach vollständigen Pfaden auf korrekte Weise zu sortieren (dh Unterordner an der richtigen Position).Sie können es so verwenden, um vollständige Pfade zu sortieren:
Verwenden Sie es nicht zum normalen Sortieren von Ordnernamen (oder Zeichenfolgen im Allgemeinen), da es etwas langsamer ist als die
sorted_alphanumeric()
oben beschriebene Funktion.natsorted
Die Bibliothek liefert falsche Ergebnisse, wenn Sie eine Windows Explorer-Sortierung erwarten. Verwenden Sie diese Optionwinsort()
.quelle
print( sorted_aphanumeric(["1", "10", "2", "foo_10", "foo_8"]) )
->['1', '2', '10', 'foo_8', 'foo_10']
. Genau wie erwartet.natsorted
der Implementierung der Windows Explorer-Matching-Funktionalität. Vielleicht sollten Sie eine Lösung beitragen? github.com/SethMMorton/natsort/issues/41Ich denke, standardmäßig wird die Reihenfolge mit dem ASCII-Wert bestimmt. Die Lösung für dieses Problem ist diese
quelle
Es ist wahrscheinlich nur die Reihenfolge, in der C
readdir()
zurückkehrt. Versuchen Sie, dieses C-Programm auszuführen:Die Build-Linie sollte so etwas wie sein
gcc -o foo foo.c
.PS Ich habe gerade diesen und Ihren Python-Code ausgeführt, und beide haben mir eine sortierte Ausgabe gegeben, sodass ich nicht reproduzieren kann, was Sie sehen.
quelle
Als im Falle meiner Anforderung habe ich den Fall wie
row_163.pkl
hieros.path.splitext('row_163.pkl')
wird es in brechen('row_163', '.pkl')
aufteilen ihn auch basierend auf '_' aufteilen.aber im Falle Ihrer Anforderung können Sie so etwas tun
wo
und auch zum Abrufen von Verzeichnissen können Sie tun
sorted(os.listdir(path))
und für den Fall von like
'run01.txt'
oder'run01.csv'
du kannst so machenquelle
Ich fand, dass "sort" nicht immer das tut, was ich erwartet hatte. zB habe ich ein Verzeichnis wie unten und die "Sortierung" gibt mir ein sehr seltsames Ergebnis:
Es scheint, dass es das erste Zeichen zuerst vergleicht, wenn das das größte ist, wäre es das letzte.
quelle
('5' > '403') is True
.Aus der Dokumentation :
Dies bedeutet, dass die Reihenfolge wahrscheinlich vom Betriebssystem / Dateisystem abhängig ist, keine besonders aussagekräftige Reihenfolge aufweist und daher keine Garantie für eine bestimmte Reihenfolge besteht. Wie viele Antworten erwähnt: Falls gewünscht, kann die abgerufene Liste sortiert werden.
Prost :)
quelle
Elliots Antwort löst es perfekt, aber da es sich um einen Kommentar handelt, bleibt er unbemerkt. Mit dem Ziel, jemandem zu helfen, wiederhole ich ihn als Lösung.
Verwenden Sie die Natsort-Bibliothek:
Installieren Sie die Bibliothek mit dem folgenden Befehl für Ubuntu und andere Debian-Versionen
Python 2
Python 3
Details zur Verwendung dieser Bibliothek finden Sie hier
quelle
sorted()
! Dankequelle
Die vorgeschlagene Kombination von os.listdir und sortierten Befehlen generiert das gleiche Ergebnis wie der Befehl ls -l unter Linux. Das folgende Beispiel bestätigt diese Annahme:
Für jemanden, der das Ergebnis des bekannten Befehls ls -l in seinem Python-Code reproduzieren möchte, funktioniert sortiert (os.listdir (DIR)) also ziemlich gut.
quelle