Quelle est la meilleure façon d'obtenir une liste de tous les fichiers d'un répertoire, triés par date [créé | modifié], en utilisant python, sur une machine Windows?
129
Mise à jour : pour trier dirpath
les entrées par date de modification dans Python 3:
import os
from pathlib import Path
paths = sorted(Path(dirpath).iterdir(), key=os.path.getmtime)
(mettez la réponse de @ Pygirl ici pour une plus grande visibilité)
Si vous avez déjà une liste de noms de fichiers files
, alors pour la trier sur place par heure de création sous Windows:
files.sort(key=os.path.getctime)
La liste des fichiers que vous pourriez obtenir, par exemple, en utilisant glob
comme indiqué dans la réponse de @ Jay .
ancienne réponse
Voici une version plus détaillée de @Greg Hewgill
la réponse de . C'est la plus conforme aux exigences de la question. Il fait une 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
cdate
est un nombre flottant de secondes depuis Epoch.stat
une fois par entrée de répertoire.J'ai fait cela dans le passé pour un script Python afin de déterminer les derniers fichiers mis à jour dans un répertoire:
Cela devrait faire ce que vous recherchez en fonction du fichier mtime.
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 d'origine était que je voulais utiliser glob pour rechercher uniquement des fichiers avec un ensemble particulier des extensions de fichiers, auxquelles glob () était mieux adapté. Pour utiliser listdir, voici à quoi cela ressemblerait:
la source
files.sort(key=lambda fn: os.path.getmtime(os.path.join(search_dir, fn)))
files.sort(key=os.path.getmtime)
devrait fonctionner (sanslambda
).Il existe une
os.path.getmtime
fonction qui donne le nombre de secondes depuis l'époque et devrait être plus rapide queos.stat
.la source
Voici ma version:
Tout d'abord, nous construisons une liste des noms de fichiers. isfile () est utilisé pour sauter les répertoires; il peut être omis si des répertoires doivent être inclus. Ensuite, nous trions la liste sur place, en utilisant la date de modification comme clé.
la source
a[-5:]
Voici un one-liner:
Cela appelle os.listdir () pour obtenir une liste des noms de fichiers, puis appelle os.stat () pour chacun d'eux pour obtenir l'heure de création, puis trie par rapport à 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 d'un tri.
la source
Sans changer de répertoire:
la source
En python 3.5+
la source
f.stat().st_ctime
plutôt.Voici ma réponse en utilisant glob sans filtre si vous souhaitez lire des fichiers avec une certaine extension par ordre de date (Python 3).
la source
la source
Vous pouvez utiliser
os.walk('.').next()[-1]
au lieu de filtrer avecos.path.isfile
, mais cela laisse des liens symboliques morts dans la liste etos.stat
échouera sur eux.la source
ou
ou
où m temps est le temps modifié.
la source
c'est une étape de base pour apprendre:
la source
La réponse d'Alex Coventry produira une exception si le fichier est un lien symbolique vers un fichier inexistant, le code suivant corrige cette réponse:
Lorsque le fichier n'existe pas, now () est utilisé, et le lien symbolique ira à la toute fin de la liste.
la source
Voici quelques lignes simples qui recherchent une extension et fournissent une option de tri
la source
Pour être complet avec
os.scandir
(2x plus rapidepathlib
):la source
C'était ma version:
la source
Vous devriez peut-être utiliser des commandes shell. Sous Unix / Linux, find piped with sort sera probablement capable de faire ce que vous voulez.
la source