Comment obtenir une liste de répertoires Classé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, Classés par date [créé | modifié], en utilisant python, sur une machine windows?

82
demandé sur Liza 2008-10-03 23:10:08

12 réponses

Voici une version plus verbeuse de @Greg Hewgill 's answer . C'est le plus conforme aux exigences de la question. Il fait une distinction entre les dates de création et de modification (au moins sur 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
49
répondu jfs 2017-05-23 12:10:36

j'ai fait cela 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))

qui devrait faire ce que vous recherchez basé sur file mtime.

EDIT : notez que vous pouvez également utiliser os.listdir() à la place de glob.glob () si désiré - la raison pour laquelle j'ai utilisé glob dans mon code d'origine était que je voulais utiliser glob pour seulement rechercher des fichiers avec un ensemble particulier d'extensions de fichiers, à quoi glob () convenait le mieux. Pour utiliser listdir voici à quoi il 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))
98
répondu Jay 2009-02-12 16:26:49

Voici une doublure:

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)])

ça s'appelle os.listdir() pour obtenir une liste des noms de fichiers, puis appelle os.stat () pour que chacun obtienne le temps de création, puis trie en fonction du temps de création.

notez que cette méthode ne fait appel qu'à os.stat() une fois pour chaque fichier, qui sera plus efficace que de l'appeler pour chaque comparaison, dans une sorte.

20
répondu Greg Hewgill 2008-10-03 19:15:23

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

tout d'Abord, nous construisons une liste des noms de fichiers. isfile () est utilisé pour sauter des répertoires; il peut être omis si des répertoires doivent être inclus. Ensuite, nous trions la liste en place, en utilisant la date de modification comme clé.

17
répondu efotinis 2008-10-03 19:46:53

il y a une fonction os.path.getmtime qui donne le nombre de secondes depuis l'époque et devrait être plus rapide que l'os.stats.

os.chdir(directory)
sorted(filter(os.path.isfile, os.listdir('.')), key=os.path.getmtime)
15
répondu Miguel de Val-Borro 2014-02-03 19:01:54

sans changer de répertoire:

import os    

path = '/path/to/files/'
name_list = os.listdir(path)
full_list = [os.path.join(path,i) for i in name_list]
time_sorted_list = sorted(full_list, key=os.path.getmtime)

print time_sorted_list

# if you want just the filenames sorted, simply remove the dir from each
sorted_filename_list = [ os.path.basename(i) for i in time_sorted_list]
print sorted_filename_list
14
répondu Nic 2015-05-21 18:28:30

voici ma réponse en utilisant glob Sans filtre si vous voulez lire des fichiers avec une certaine extension dans l'ordre des dates (Python 3).

dataset_path='/mydir/'   
files = glob.glob(dataset_path+"/morepath/*.extension")   
files.sort(key=os.path.getmtime)
9
répondu dinos66 2013-09-13 09:59:29
sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.stat(p).st_mtime)

vous pouvez utiliser os.walk('.').next()[-1] au lieu de filtrer avec os.path.isfile , mais cela laisse des liens symboliques morts dans la liste, et os.stat échouera sur eux.

4
répondu Alex Coventry 2008-10-03 20:07:15

en python 3.5+

from pathlib import Path
sorted(Path('.').iterdir(), key=lambda f: f.stat().st_mtime)
4
répondu ignorant 2017-09-15 04:25:28

c'est une étape de base pour apprendre:

import os, stat, sys
import time

dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'

listdir = os.listdir(dirpath)

for i in listdir:
    os.chdir(dirpath)
    data_001 = os.path.realpath(i)
    listdir_stat1 = os.stat(data_001)
    listdir_stat2 = ((os.stat(data_001), data_001))
    print time.ctime(listdir_stat1.st_ctime), data_001
1
répondu cumulus_13 2011-10-18 22:44:37

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:

import time
import datetime
sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.path.exists(p) and os.stat(p).st_mtime or time.mktime(datetime.now().timetuple())

Lorsque le fichier n'existe pas, now() est utilisé, et le lien va aller à la fin de la liste.

1
répondu Paolo Benvenuto 2017-08-11 21:18:41

peut-être devriez-vous utiliser des commandes shell. Dans Unix / Linux, find piped avec sort sera probablement capable de faire ce que vous voulez.

-4
répondu stephanea 2008-10-03 19:14:18