202 votes

Comment obtenir le dernier fichier d'un dossier à l'aide de python ?

J'ai besoin de récupérer le dernier fichier d'un dossier en utilisant python. En utilisant le code :

max(files, key = os.path.getctime)

J'obtiens l'erreur suivante :

FileNotFoundError : [WinError 2] Le système ne peut pas trouver le fichier spécifié : 'a'

3 votes

Quel est le fichier que vous essayez de trouver ? Ajoutez votre code pertinent à la quesiton.

1 votes

Je devine pourquoi cela ne fonctionne pas pour vous : est-ce que "files" est une liste d'éléments de noms de fichiers ou une seule chaîne de noms de fichiers ?

482voto

Marlon Abeykoon Points 105

Tout ce qui est attribué à la files est incorrecte. 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

4 votes

Et si, au lieu d'un fichier, je voulais trouver le dernier dossier créé/modifié ?

4 votes

@Link le même code fonctionne pour cela. Si vous voulez vérifier s'il s'agit d'un dossier ou non, vous pouvez le faire de la manière suivante if os.path.isdir(latest_file):

0 votes

Cette partie que vous avez ajoutée, où doit-elle être placée ? A la fin du code ci-dessus ou à sa place ? Merci.

68voto

glglgl Points 35668
max(files, key = os.path.getctime)

est un code très incomplet. Ce qui est files ? Il s'agit probablement d'une liste de noms de fichiers, provenant 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 mène (et utilisé pour l'obtenir).

Par exemple (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)

2 votes

Je suis sûr que les personnes qui ont voté contre peuvent expliquer ce qui ne va pas.

6 votes

Je ne sais pas, testé pour toi, ça semble fonctionner. En plus de cela, vous êtes le seul à avoir pris soin d'expliquer un peu. En lisant la réponse acceptée, j'ai pensé que ce truc 'glob' était nécessaire, alors que ce n'est absolument pas le cas. Merci

0 votes

Existe-t-il un moyen de ne sélectionner que certains types de fichiers, comme le CSV ?

13voto

BreakBadSP Points 186

Je suggère d'utiliser glob.iglob() au lieu de la glob.glob() car elle est plus efficace.

glob.iglob() Retourne un itérateur qui donne les mêmes valeurs que glob() sans les stocker toutes simultanément.

Ce qui signifie glob.iglob() sera plus efficace.

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)


NOTE : Il existe des variantes de max En cas de recherche du dernier fichier, nous utiliserons la variante suivante : max(iterable, *[, key, default])

qui nécessite un itérable, donc votre premier paramètre doit être itérable. Dans le cas de trouver le maximum de nombres, nous pouvons utiliser la variante beow : max (num1, num2, num3, *args[, key])

2 votes

J'aime ça. max() trier. Dans mon cas, j'ai utilisé un autre key=os.path.basename puisque les noms de fichiers contenaient des horodatages.

6voto

turkus Points 1949

Essayez de trier les éléments par date 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.

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]

1voto

TheNoble-Coder Points 810

(Modifié pour améliorer la réponse)

Définir 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 une 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 retourner 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 votes

Où avez-vous trouvé le JuniperAccessLog-standalone-FCL_VPN de la part de ?

0 votes

Cela échoue sur les fichiers de longueur 0 sous Windows 10.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X