J'ai besoin d'obtenir le dernier fichier d'un dossier en utilisant python. Lors de l'utilisation du code:
max(files, key = os.path.getctime)
J'obtiens l'erreur ci-dessous:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
python
python-3.x
python-2.7
garlapak
la source
la source
Réponses:
Tout ce qui est attribué à la
files
variable est incorrect. Utilisez le code suivant.la source
if os.path.isdir(latest_file):
pathlib.Path
objets plus qu'avec des chaînes et os.path. Avec les objets pathlib.Path, votre réponse devient:list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
os.path.getctime
comme clé, même avec desPath
objets.est un code assez incomplet. C'est quoi
files
? C'est probablement une liste de noms de fichiers, sortant deos.listdir()
.Mais cette liste ne répertorie que les parties du nom de fichier (aka "basenames"), car leur chemin est commun. Pour l'utiliser correctement, vous devez le combiner avec le chemin qui y mène (et utilisé pour l'obtenir).
Tels que (non testé):
la source
if basename.endswith('.csv')
dans la liste de compréhension.Je suggérerais d'utiliser à la
glob.iglob()
place duglob.glob()
, car il est plus efficace.Ce qui signifie
glob.iglob()
seront plus efficaces.J'utilise principalement le code ci-dessous pour trouver le dernier fichier correspondant à mon modèle:
LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)
REMARQUE: il existe des variantes de
max
fonction, en cas de recherche du dernier fichier, nous utiliserons la variante ci-dessous:max(iterable, *[, key, default])
qui doit être itérable afin que votre premier paramètre soit itérable. En cas de recherche d'un maximum de nombres, nous pouvons utiliser la variante ci-dessous:
max (num1, num2, num3, *args[, key])
la source
max()
genre. Dans mon cas, j'en ai utilisé un autrekey=os.path.basename
car les noms de fichiers avaient des horodatages.Essayez de trier les éléments par heure de création. L'exemple ci-dessous trie les fichiers dans un dossier et obtient le premier élément qui est le plus récent.
la source
Je n'ai pas la réputation de commenter mais ctime de la réponse de Marlon Abeykoons n'a pas donné le résultat correct pour moi. L'utilisation de mtime fait cependant l'affaire. (clé = os.path.get m heure))
J'ai trouvé deux réponses à ce problème:
python os.path.getctime max ne renvoie pas la dernière différence entre python - getmtime () et getctime () dans le système unix
la source
(Modifié pour améliorer la réponse)
Définissez d'abord une fonction get_latest_file
Vous pouvez également utiliser une docstring!
Si vous utilisez Python 3 , vous pouvez utiliser iglob à la place.
Code complet pour renvoyer le nom du dernier fichier:
la source
JuniperAccessLog-standalone-FCL_VPN
pièce?J'ai essayé d'utiliser les suggestions ci-dessus et mon programme s'est écrasé, puis j'ai compris que le fichier que j'essayais d'identifier était utilisé et que lorsque j'essayais d'utiliser 'os.path.getctime', il s'est écrasé. ce qui a finalement fonctionné pour moi était:
ce code obtient l'objet rare 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
la source
Une méthode beaucoup plus rapide sur Windows (0.05s), appelez un script bat qui fait ceci:
get_latest.bat
où
\\directory\in\question
est le répertoire que vous souhaitez étudier.get_latest.py
s'il trouve un fichier
stdout
est le chemin etstderr
est None.Utilisez
stdout.decode("utf-8").rstrip()
pour obtenir la représentation sous forme de chaîne utilisable du nom de fichier.la source
ls -Art | tail -n 1
. Veuillez évaluer les performances d'une solution avant de faire des réclamations à son sujet.Je l'utilise dans Python 3, y compris la correspondance de motif sur le nom de fichier.
la source