j'ai besoin d'obtenir le dernier fichier d'un dossier en utilisant python. En utilisant le code:
max(files, key = os.path.getctime)
Je reçois l'erreur ci-dessous:
FileNotFoundError: [WinError 2] Le système ne peut pas trouver le fichier spécifié: 'a'
Tout ce qui est assigné à la variable files
est incorrect. Utilisez le code suivant.
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)
est un code assez incomplet. Qu'est-ce que files
? C'est probablement une liste de noms de fichiers, sortant de os.listdir()
.
Mais cette liste ne répertorie que les parties du nom de fichier (a. K. A. "Basenames"), car leur chemin est commun. Pour l'utiliser correctement, vous devez le combiner avec le chemin qui y conduit (et utilisé pour l'obtenir).
Tels que (non testé):
def newest(path):
files = os.listdir(path)
paths = [os.path.join(path, basename) for basename in files]
return max(paths, key=os.path.getctime)
Essayez de trier les éléments par date de création. L'exemple ci-dessous trie les fichiers d'un dossier et obtient le premier élément, le plus récent.
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]
Une méthode beaucoup plus rapide sur Windows (0.05s), appelez un script bat qui fait ceci:
get_latest.bat
@echo off
for /f %%i in ('dir \\directory\in\question /b/a-d/od/t:c') do set LAST=%%i
%LAST%
où \\directory\in\question
est le répertoire que vous souhaitez explorer.
get_latest.py
from subprocess import Popen, PIPE
p = Popen("get_latest.bat", Shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)
s'il trouve un fichier stdout
est le chemin et stderr
est Aucun.
Utilisez stdout.decode("utf-8").rstrip()
pour obtenir la représentation sous forme de chaîne utilisable du nom de fichier.
(Edité pour améliorer la réponse)
Définissez d'abord une fonction get_latest_file
def get_latest_file(path, *paths):
fullpath = os.path.join(path, paths)
...
get_latest_file('example', 'files','randomtext011.*.txt')
Vous pouvez également utiliser un docstring!
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)
Si vous utilisez Python 3, vous pouvez utiliser iglob à la place.
Code complet pour renvoyer le nom du dernier fichier:
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
J'ai essayé d'utiliser les suggestions ci-dessus et mon programme s'est écrasé, alors j'ai découvert que le fichier que j'essayais d'identifier était utilisé et lorsque j'essayais d'utiliser 'os.path.getctime', il se bloquait était:
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,'*'))))
ce code obtient l'objet peu commun entre les deux ensembles de listes de fichiers ce n'est pas le plus élégant, et si plusieurs fichiers sont créés en même temps, il ne sera probablement pas stable