Ich habe den folgenden Python-Code geschrieben:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, glob
path = '/home/my/path'
for infile in glob.glob( os.path.join(path, '*.png') ):
print infile
Jetzt verstehe ich das:
/home/my/path/output0352.png
/home/my/path/output0005.png
/home/my/path/output0137.png
/home/my/path/output0202.png
/home/my/path/output0023.png
/home/my/path/output0048.png
/home/my/path/output0069.png
/home/my/path/output0246.png
/home/my/path/output0071.png
/home/my/path/output0402.png
/home/my/path/output0230.png
/home/my/path/output0182.png
/home/my/path/output0121.png
/home/my/path/output0104.png
/home/my/path/output0219.png
/home/my/path/output0226.png
/home/my/path/output0215.png
/home/my/path/output0266.png
/home/my/path/output0347.png
/home/my/path/output0295.png
/home/my/path/output0131.png
/home/my/path/output0208.png
/home/my/path/output0194.png
Wie wird es bestellt?
Es könnte Ihnen helfen, meine ls-l-Ausgabe zu erhalten:
-rw-r--r-- 1 moose moose 627669 2011-07-17 17:26 output0005.png
-rw-r--r-- 1 moose moose 596417 2011-07-17 17:26 output0023.png
-rw-r--r-- 1 moose moose 543639 2011-07-17 17:26 output0048.png
-rw-r--r-- 1 moose moose 535384 2011-07-17 17:27 output0069.png
-rw-r--r-- 1 moose moose 543216 2011-07-17 17:27 output0071.png
-rw-r--r-- 1 moose moose 561776 2011-07-17 17:27 output0104.png
-rw-r--r-- 1 moose moose 501865 2011-07-17 17:27 output0121.png
-rw-r--r-- 1 moose moose 547144 2011-07-17 17:27 output0131.png
-rw-r--r-- 1 moose moose 530596 2011-07-17 17:27 output0137.png
-rw-r--r-- 1 moose moose 532567 2011-07-17 17:27 output0182.png
-rw-r--r-- 1 moose moose 553562 2011-07-17 17:27 output0194.png
-rw-r--r-- 1 moose moose 574065 2011-07-17 17:27 output0202.png
-rw-r--r-- 1 moose moose 552197 2011-07-17 17:27 output0208.png
-rw-r--r-- 1 moose moose 559809 2011-07-17 17:27 output0215.png
-rw-r--r-- 1 moose moose 549046 2011-07-17 17:27 output0219.png
-rw-r--r-- 1 moose moose 566661 2011-07-17 17:27 output0226.png
-rw-r--r-- 1 moose moose 561678 2011-07-17 17:27 output0246.png
-rw-r--r-- 1 moose moose 525550 2011-07-17 17:27 output0266.png
-rw-r--r-- 1 moose moose 565715 2011-07-17 17:27 output0295.png
-rw-r--r-- 1 moose moose 568381 2011-07-17 17:28 output0347.png
-rw-r--r-- 1 moose moose 532768 2011-07-17 17:28 output0352.png
-rw-r--r-- 1 moose moose 535818 2011-07-17 17:28 output0402.png
Es ist nicht nach Dateiname oder Größe sortiert.
ls
Befehl selbst Dateien nach Namen sortiert. 'ls -U' gibt eine ungeordnete Liste von Dateien in "Verzeichnisreihenfolge" an.os.listdir
: * nix OS gibt Dateien in einer nicht alphabetischen Reihenfolge zurück, und (schade, dass ich überrascht bin!) Dies wird in der Dokumentation explizit angegeben : "Die Liste ist in beliebiger Reihenfolge".Antworten:
Es ist wahrscheinlich überhaupt nicht sortiert und verwendet die Reihenfolge, in der Einträge im Dateisystem angezeigt werden, dh die, die Sie bei der Verwendung erhalten
ls -U
. (Zumindest auf meinem Computer ergibt dies die gleiche Reihenfolge wie das Auflisten vonglob
Übereinstimmungen).quelle
Die Reihenfolge ist beliebig, aber Sie können sie selbst sortieren
Wenn Sie nach Namen sortiert werden möchten:
sortiert nach Änderungszeit:
sortiert nach Größe:
etc.
quelle
files = glob.glob('teksty/*')
. Wird der Auftrag von nam erteilt?Indem Sie den Quellcode von überprüfen
glob.glob
, sehen Sie, dass er intern aufruftos.listdir
, wie hier beschrieben:http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir
Schlüsselsatz: os.listdir (Pfad) Gibt eine Liste zurück, die die Namen der Einträge in dem durch path angegebenen Verzeichnis enthält. Die Liste ist in beliebiger Reihenfolge. Die Sondereinträge '.' Sind nicht enthalten. und '..' auch wenn sie im Verzeichnis vorhanden sind.
Beliebige Reihenfolge . :) :)
quelle
glob.glob () ist ein Wrapper um os.listdir (), sodass das zugrunde liegende Betriebssystem für die Bereitstellung der Daten verantwortlich ist. Generell: Sie können hier keine Annahme über die Bestellung machen. Die Grundannahme lautet: keine Bestellung. Wenn Sie eine Sortierung benötigen: Sortieren Sie auf Anwendungsebene.
quelle
Die Reihenfolge ist willkürlich, aber es gibt verschiedene Möglichkeiten, sie zu sortieren. Eine davon ist wie folgt:
quelle
natsort
:from natsort import natsorted; files = natsorted(files)
.Ich hatte ein ähnliches Problem,
glob
gab eine Liste von Dateinamen in einer beliebigen Reihenfolge zurück, wollte sie jedoch in numerischer Reihenfolge durchgehen, wie durch den Dateinamen angegeben. So habe ich es erreicht:Meine Dateien wurden zurückgegeben von
glob
:Ich habe die Liste sortiert, dazu habe ich eine Funktion erstellt:
Diese Funktion gibt den numerischen Teil des Dateinamens zurück und konvertiert in eine Ganzzahl. Ich habe dann die Sortiermethode in der Liste als solche aufgerufen:
Dies gab eine Liste als solche zurück:
quelle
os.path.splitext(os.path.basename(s))[0]
alsos.path.basename(s)[:-4]
, also wird die Funktionsdefinition sein.def sortKeyFunc(s): return int(os.path.splitext(os.path.basename(s))[0])
Wenn Sie sich fragen, was glob.glob in der Vergangenheit auf Ihrem System getan hat und keinen
sorted
Anruf hinzufügen kann , ist die Reihenfolge auf Mac HFS + -Dateisystemen konsistent und auf anderen Unix-Systemen die Durchlaufreihenfolge . Es wird also wahrscheinlich deterministisch gewesen sein, wenn das zugrunde liegende Dateisystem nicht neu organisiert wurde. Dies kann passieren, wenn Dateien hinzugefügt, entfernt, umbenannt, gelöscht, verschoben usw. werden.quelle
Aus der Lösung von @Johan La Rooy, Sortieren der Bilder mit
sorted(glob.glob('*.png'))
nicht für mich. Die Ausgabeliste ist immer noch nicht nach Namen geordnet.Die
sorted(glob.glob('*.png'), key=os.path.getmtime)
funktioniert aber perfekt.Ich bin etwas verwirrt, wie das Sortieren nach Namen hier nicht funktioniert.
Vielen Dank an @Martin Thoma für die Veröffentlichung dieser großartigen Frage und an @Johan La Rooy für die hilfreichen Lösungen.
quelle
Bitte versuchen Sie diesen Code:
quelle
So habe ich meinen speziellen Fall gemacht. Hoffe es ist hilfreich.
quelle