web-dev-qa-db-fra.com

Comment obtenir le dernier fichier dans un dossier en utilisant python

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'

55
garlapak

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
163
Marlon Abeykoon
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)
18
glglgl

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]
4
turkus

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%

\\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.

0
ic_fl2

(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
0
Naeem Ul Wahhab

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

0
AlexFink