190 votes

Comment obtenir une liste de répertoires triés par date de création en python ?

Quelle est la meilleure façon d'obtenir une liste de tous les fichiers d'un répertoire, triés par date [création | modification], en utilisant python, sur une machine Windows ?

180voto

Jay Points 20373

Je l'ai fait dans le passé pour un script Python pour déterminer les derniers fichiers mis à jour dans un répertoire :

import glob
import os

search_dir = "/mydir/"
# remove anything from the list that is not a file (directories, symlinks)
# thanks to J.F. Sebastion for pointing out that the requirement was a list 
# of files (presumably not including directories)  
files = filter(os.path.isfile, glob.glob(search_dir + "*"))
files.sort(key=lambda x: os.path.getmtime(x))

Cela devrait faire ce que vous recherchez en se basant sur le mtime du fichier.

EDIT : Notez que vous pouvez également utiliser os.listdir() à la place de glob.glob() si vous le souhaitez - la raison pour laquelle j'ai utilisé glob dans mon code original était que je voulais utiliser glob pour rechercher uniquement les fichiers avec un ensemble particulier d'extensions de fichiers, ce à quoi glob() était mieux adapté. Pour utiliser listdir, voici à quoi cela ressemblerait :

import os

search_dir = "/mydir/"
os.chdir(search_dir)
files = filter(os.path.isfile, os.listdir(search_dir))
files = [os.path.join(search_dir, f) for f in files] # add path to each file
files.sort(key=lambda x: os.path.getmtime(x))

160voto

J.F. Sebastian Points 102961

Voici une version plus verbeuse de @Greg Hewgill Réponse de la Commission . Il est le plus conforme aux exigences de la question. Il fait la distinction entre les dates de création et de modification (au moins sous Windows).

#!/usr/bin/env python
from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time

# path to the directory (relative or absolute)
dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'

# get all entries in the directory w/ stats
entries = (os.path.join(dirpath, fn) for fn in os.listdir(dirpath))
entries = ((os.stat(path), path) for path in entries)

# leave only regular files, insert creation date
entries = ((stat[ST_CTIME], path)
           for stat, path in entries if S_ISREG(stat[ST_MODE]))
#NOTE: on Windows `ST_CTIME` is a creation date 
#  but on Unix it could be something else
#NOTE: use `ST_MTIME` to sort by a modification date

for cdate, path in sorted(entries):
    print time.ctime(cdate), os.path.basename(path)

Exemple :

$ python stat_creation_date.py
Thu Feb 11 13:31:07 2009 stat_creation_date.py

41voto

Il existe un os.path.getmtime fonction qui donne le nombre de secondes depuis l'époque et devrait être plus rapide que os.stat.

os.chdir(directory)
sorted(filter(os.path.isfile, os.listdir('.')), key=os.path.getmtime)

25voto

efotinis Points 6338

Voici ma version :

def getfiles(dirpath):
    a = [s for s in os.listdir(dirpath)
         if os.path.isfile(os.path.join(dirpath, s))]
    a.sort(key=lambda s: os.path.getmtime(os.path.join(dirpath, s)))
    return a

D'abord, nous construisons une liste des noms de fichiers. isfile() est utilisé pour sauter les répertoires ; il peut être omis si les répertoires doivent être inclus. Ensuite, nous trions la liste par ordre alphabétique, en utilisant la date de modification comme clé.

21voto

Greg Hewgill Points 356191

Voici un exemple :

import os
import time
from pprint import pprint

pprint([(x[0], time.ctime(x[1].st_ctime)) for x in sorted([(fn, os.stat(fn)) for fn in os.listdir(".")], key = lambda x: x[1].st_ctime)])

Cela appelle os.listdir() pour obtenir une liste des noms de fichiers, puis appelle os.stat() pour chacun d'entre eux afin d'obtenir l'heure de création, puis trie en fonction de l'heure de création.

Notez que cette méthode n'appelle os.stat() qu'une seule fois pour chaque fichier, ce qui sera plus efficace que de l'appeler pour chaque comparaison dans un tri.

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