Ich muss die neueste Datei eines Ordners mit Python abrufen. Während Sie den Code verwenden:
max(files, key = os.path.getctime)
Ich erhalte die folgende Fehlermeldung:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
python
python-3.x
python-2.7
garlapak
quelle
quelle
Antworten:
Was auch immer der
files
Variablen zugewiesen ist, ist falsch. Verwenden Sie den folgenden Code.quelle
if os.path.isdir(latest_file):
pathlib.Path
lieber mit Objekten als mit Strings und os.path. Mit pathlib.Path-Objekten lautet Ihre Antwort:list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
os.path.getctime
auch mitPath
Objekten als Schlüssel verwenden .ist ziemlich unvollständiger Code. Was ist
files
? Es ist wahrscheinlich eine Liste von Dateinamen, die ausos.listdir()
.Diese Liste listet jedoch nur die Dateinamen-Teile (auch als "Basisnamen" bezeichnet) auf, da deren Pfad häufig vorkommt. Um es richtig zu verwenden, müssen Sie es mit dem Pfad kombinieren, der dorthin führt (und verwendet wird, um es zu erhalten).
Wie (ungetestet):
quelle
if basename.endswith('.csv')
in das Listenverständnis einfügen .Ich würde vorschlagen,
glob.iglob()
anstelle von zu verwendenglob.glob()
, da es effizienter ist.Welches Mittel
glob.iglob()
wird effizienter sein.Ich verwende meistens den folgenden Code, um die neueste Datei zu finden, die meinem Muster entspricht:
LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)
HINWEIS: Es gibt
max
Funktionsvarianten. Wenn Sie die neueste Datei finden, verwenden wir die folgende Variante:max(iterable, *[, key, default])
Dies muss iterierbar sein, sodass Ihr erster Parameter iterierbar sein sollte. Wenn wir maximal viele Zahlen finden, können wir die folgende Variante verwenden:
max (num1, num2, num3, *args[, key])
quelle
max()
Art. In meinem Fall habe ich einen anderen verwendet,key=os.path.basename
da die Dateinamen Zeitstempel enthielten.Versuchen Sie, Elemente nach Erstellungszeit zu sortieren. Das folgende Beispiel sortiert Dateien in einem Ordner und erhält das erste Element, das aktuell ist.
quelle
Mir fehlt der Ruf, einen Kommentar abzugeben, aber die Zeit von Marlon Abeykoons Antwort ergab nicht das richtige Ergebnis für mich. Die Verwendung von mtime reicht jedoch aus. (key = os.path.get m time))
Ich habe zwei Antworten für dieses Problem gefunden:
python os.path.getctime max gibt nicht den neuesten Unterschied zwischen python - getmtime () und getctime () im Unix-System zurück
quelle
(Bearbeitet, um die Antwort zu verbessern)
Definieren Sie zuerst eine Funktion get_latest_file
Sie können auch einen Docstring verwenden!
Wenn Sie Python 3 verwenden , können Sie stattdessen iglob verwenden.
Vollständiger Code, um den Namen der neuesten Datei zurückzugeben:
quelle
JuniperAccessLog-standalone-FCL_VPN
Teil?Ich habe versucht, die oben genannten Vorschläge zu verwenden, und mein Programm ist abgestürzt, als ich herausgefunden habe, dass die Datei, die ich identifizieren möchte, verwendet wurde, und als ich versuchte, 'os.path.getctime' zu verwenden, ist sie abgestürzt. Was schließlich für mich funktioniert hat war:
Dieser Code erhält das ungewöhnliche Objekt zwischen den beiden Dateilisten. Es ist nicht das eleganteste. Wenn mehrere Dateien gleichzeitig erstellt werden, ist es wahrscheinlich nicht stabil
quelle
Eine viel schnellere Methode unter Windows (0.05s), rufen Sie ein Bat-Skript auf, das dies tut:
get_latest.bat
Wo
\\directory\in\question
ist das Verzeichnis, das Sie untersuchen möchten?get_latest.py
Wenn es eine Datei findet,
stdout
ist der Pfad undstderr
Keine.Verwenden Sie
stdout.decode("utf-8").rstrip()
diese Option , um die verwendbare Zeichenfolgendarstellung des Dateinamens abzurufen.quelle
ls -Art | tail -n 1
. Bitte bewerten Sie die Leistung einer Lösung, bevor Sie Ansprüche geltend machen.Ich habe dies in Python 3 verwendet, einschließlich Mustervergleich für den Dateinamen.
quelle