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 ?
Réponses
Trop de publicités?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))
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
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é.
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.