Was ist der beste Weg, um eine Liste aller Dateien in einem Verzeichnis zu erhalten, sortiert nach Datum [Erstellt | geändert], mit Python, auf einem Windows-Computer?
129
Update : um dirpath
die Einträge nach Änderungsdatum in Python 3 zu sortieren :
import os
from pathlib import Path
paths = sorted(Path(dirpath).iterdir(), key=os.path.getmtime)
( Geben Sie hier die Antwort von @ Pygirl ein , um die Sichtbarkeit zu verbessern. )
Wenn Sie bereits eine Liste mit Dateinamen haben files
, können Sie diese nach Erstellungszeit unter Windows sortieren:
files.sort(key=os.path.getctime)
Die Liste der Dateien, die Sie beispielsweise verwenden können, glob
wie in @ Jays Antwort gezeigt .
alte Antwort
Hier ist eine ausführlichere Version der @Greg Hewgill
Antwort . Es entspricht am ehesten den Anforderungen der Frage. Es wird zwischen Erstellungs- und Änderungsdaten unterschieden (zumindest unter Windows).
#!/usr/bin/env python
from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time
# path to the directory (relative or absolute)
dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'
# get all entries in the directory w/ stats
entries = (os.path.join(dirpath, fn) for fn in os.listdir(dirpath))
entries = ((os.stat(path), path) for path in entries)
# leave only regular files, insert creation date
entries = ((stat[ST_CTIME], path)
for stat, path in entries if S_ISREG(stat[ST_MODE]))
#NOTE: on Windows `ST_CTIME` is a creation date
# but on Unix it could be something else
#NOTE: use `ST_MTIME` to sort by a modification date
for cdate, path in sorted(entries):
print time.ctime(cdate), os.path.basename(path)
Beispiel:
$ python stat_creation_date.py
Thu Feb 11 13:31:07 2009 stat_creation_date.py
cdate
ist eine Float-Anzahl von Sekunden seit Epoche.stat
einmal pro Verzeichniseintrag auf.Ich habe dies in der Vergangenheit für ein Python-Skript getan, um die zuletzt aktualisierten Dateien in einem Verzeichnis zu ermitteln:
Das sollte das tun, wonach Sie suchen, basierend auf der Datei mtime.
BEARBEITEN : Beachten Sie, dass Sie bei Bedarf auch os.listdir () anstelle von glob.glob () verwenden können. Der Grund, warum ich glob in meinem ursprünglichen Code verwendet habe, war, dass ich glob verwenden wollte, um nur nach Dateien mit einem bestimmten Satz zu suchen von Dateierweiterungen, für die glob () besser geeignet war. Um listdir zu verwenden, würde es folgendermaßen aussehen:
quelle
files.sort(key=lambda fn: os.path.getmtime(os.path.join(search_dir, fn)))
files.sort(key=os.path.getmtime)
sollte funktionieren (ohnelambda
).Es gibt eine
os.path.getmtime
Funktion, die die Anzahl der Sekunden seit der Epoche angibt und schneller sein sollte alsos.stat
.quelle
Hier ist meine Version:
Zuerst erstellen wir eine Liste der Dateinamen. isfile () wird verwendet, um Verzeichnisse zu überspringen. Es kann weggelassen werden, wenn Verzeichnisse enthalten sein sollten. Anschließend sortieren wir die Liste direkt und verwenden das Änderungsdatum als Schlüssel.
quelle
a[-5:]
Hier ist ein Einzeiler:
Dies ruft os.listdir () auf, um eine Liste der Dateinamen abzurufen, ruft dann os.stat () auf, um die Erstellungszeit abzurufen, und sortiert dann nach der Erstellungszeit.
Beachten Sie, dass diese Methode os.stat () für jede Datei nur einmal aufruft. Dies ist effizienter als das Aufrufen für jeden Vergleich in einer Sortierung.
quelle
Ohne das Verzeichnis zu wechseln:
quelle
In Python 3.5+
quelle
f.stat().st_ctime
stattdessen das Erstellungsdatum .Hier ist meine Antwort mit glob ohne Filter, wenn Sie Dateien mit einer bestimmten Erweiterung in Datumsreihenfolge lesen möchten (Python 3).
quelle
quelle
Sie könnten verwenden,
os.walk('.').next()[-1]
anstatt mit zu filternos.path.isfile
, aber das lässt tote Symlinks in der Liste undos.stat
schlägt bei ihnen fehl.quelle
oder
oder
Dabei ist m Zeit die geänderte Zeit.
quelle
Dies ist ein grundlegender Schritt zum Lernen:
quelle
Die Antwort von Alex Coventry führt zu einer Ausnahme, wenn die Datei ein Symlink zu einer nicht vorhandenen Datei ist. Der folgende Code korrigiert diese Antwort:
Wenn die Datei nicht vorhanden ist, wird now () verwendet und der Symlink wird ganz am Ende der Liste angezeigt.
quelle
Hier ist ein einfaches paar Zeilen, die nach Erweiterung suchen und eine Sortieroption bieten
quelle
Der Vollständigkeit
os.scandir
halber mit (2x schnellerpathlib
):quelle
Das war meine Version:
quelle
Vielleicht sollten Sie Shell-Befehle verwenden. Unter Unix / Linux kann find piped with sort wahrscheinlich das tun, was Sie wollen.
quelle