ich muss die neueste Datei eines Ordners mit Python abrufen. Bei der Verwendung des Codes:
max(files, key = os.path.getctime)
Ich erhalte die folgende Fehlermeldung:
FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finden: 'a'
Was der Variablen files
zugewiesen ist, ist falsch. Verwenden Sie den folgenden Code.
import glob
import os
list_of_files = glob.glob('/path/to/folder/*') # * means all if need specific format then *.csv
latest_file = max(list_of_files, key=os.path.getctime)
print latest_file
max(files, key = os.path.getctime)
ist ziemlich unvollständiger Code. Was ist files
? Es ist wahrscheinlich eine Liste von Dateinamen, die aus os.listdir()
hervorgehen.
In dieser Liste werden jedoch nur die Dateinamen (a. K. A. "Basenames") aufgeführt, da der Pfad häufig ist. Um es richtig zu verwenden, müssen Sie es mit dem Pfad verbinden, der zu ihm führt (und dazu verwendet wurde).
Wie (nicht getestet):
def newest(path):
files = os.listdir(path)
paths = [os.path.join(path, basename) for basename in files]
return max(paths, key=os.path.getctime)
Ich würde vorschlagen, glob.iglob()
anstelle von glob.glob()
zu verwenden, da dies effizienter ist.
glob.iglob () Gibt einen Iterator zurück, der dieselben Werte wie glob () liefert, ohne diese gleichzeitig zu speichern.
Was bedeutet, dass glob.iglob()
effizienter ist.
Ich verwende meistens den folgenden Code, um die neueste Datei zu finden, die zu meinem Muster passt:
LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)
HINWEIS: Es gibt Varianten der Funktion max
. Wenn die neueste Datei gefunden wird, verwenden wir die folgende Variante: max(iterable, *[, key, default])
das muss iterabel sein, sodass Ihr erster Parameter iterabel sein sollte. Wenn Sie maximal eine Zahl finden, können Sie die folgende Variante verwenden: max (num1, num2, num3, *args[, key])
Versuchen Sie, die Elemente nach Erstellungszeit zu sortieren. Das folgende Beispiel sortiert Dateien in einem Ordner und erhält das erste aktuelle Element.
import glob
import os
files_path = os.path.join(folder, '*')
files = sorted(
glob.iglob(files_path), key=os.path.getctime, reverse=True)
print files[0]
Rufen Sie als viel schnellere Methode unter Windows (0,05 s) ein bat-Skript auf, das dies ausführt:
get_latest.bat
@echo off
for /f %%i in ('dir \\directory\in\question /b/a-d/od/t:c') do set LAST=%%i
%LAST%
dabei ist \\directory\in\question
das Verzeichnis, das Sie untersuchen möchten.
get_latest.py
from subprocess import Popen, PIPE
p = Popen("get_latest.bat", Shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)
wenn eine Datei gefunden wird, ist stdout
der Pfad und stderr
None.
Verwenden Sie stdout.decode("utf-8").rstrip()
, um die verwendbare Zeichenfolgendarstellung des Dateinamens abzurufen.
(Zur Verbesserung der Antwort bearbeitet)
Definieren Sie zuerst eine Funktion get_latest_file
def get_latest_file(path, *paths):
fullpath = os.path.join(path, paths)
...
get_latest_file('example', 'files','randomtext011.*.txt')
Sie können auch einen Docstring verwenden!
def get_latest_file(path, *paths):
"""Returns the name of the latest (most recent) file
of the joined path(s)"""
fullpath = os.path.join(path, *paths)
Wenn Sie Python 3 verwenden, können Sie stattdessen iglob verwenden.
Vollständiger Code, um den Namen der neuesten Datei zurückzugeben:
def get_latest_file(path, *paths):
"""Returns the name of the latest (most recent) file
of the joined path(s)"""
fullpath = os.path.join(path, *paths)
files = glob.glob(fullpath) # You may use iglob in Python3
if not files: # I prefer using the negation
return None # because it behaves like a shortcut
latest_file = max(files, key=os.path.getctime)
_, filename = os.path.split(latest_file)
return filename
Ich habe versucht, die obigen Vorschläge zu verwenden, und mein Programm stürzte ab, als ich herausfand, dass die Datei, die ich zu identifizieren versuchte, verwendet wurde. Beim Versuch, 'os.path.getctime' zu verwenden, stürzte es ab war:
files_before = glob.glob(os.path.join(my_path,'*'))
**code where new file is created**
new_file = set(files_before).symmetric_difference(set(glob.glob(os.path.join(my_path,'*'))))
dieser Code ruft das ungewöhnliche Objekt zwischen den beiden Dateilistengruppen auf. __ es ist nicht das eleganteste, und wenn mehrere Dateien gleichzeitig erstellt werden, ist es wahrscheinlich nicht stabil