web-dev-qa-db-fra.com

Comment obtenir une liste de répertoires triée 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éé | modifié], en utilisant python, sur une machine Windows?

102
Liza

Voici une version plus verbeuse de réponse de @Greg Hewgill . C'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
53
jfs

Je l'ai déjà fait par le passé pour un Python) permettant de 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 cherchez basé sur le 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 C’était que je voulais utiliser glob pour rechercher uniquement les fichiers avec un ensemble particulier d’extensions de fichier, auquel glob () était le mieux adapté. Pour utiliser listdir, voici à quoi cela pourrait ressembler:

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))
121
Jay

Il y a un os.path.getmtime fonction indiquant le nombre de secondes écoulées depuis l’époque et devant être plus rapide que os.stat.

import os 

os.chdir(directory)
sorted(filter(os.path.isfile, os.listdir('.')), key=os.path.getmtime)
23
Miguel de Val-Borro

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 ignorer 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é.

22
efotinis

Voici un one-liner:

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

Ceci appelle os.listdir () pour obtenir une liste des noms de fichiers, puis appelle os.stat () pour chacun d’eux afin d’obtenir l’heure de création, puis effectue un tri par rapport à l’heure de création.

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

20
Greg Hewgill

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
15
Nic

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)
11
dinos66

Dans python 3.5+

from pathlib import Path
sorted(Path('.').iterdir(), key=lambda f: f.stat().st_mtime)
9
ignorant
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.

4
Alex Coventry

La réponse d'Alex Coventry générera 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())

Quand le fichier n'existe pas, now () est utilisé, et le lien symbolique ira à la toute fin de la liste.

1
Paolo Benvenuto

c'est une étape fondamentale 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
cumulus_13

Voici quelques lignes simples qui cherchent une extension et fournissent une option de tri.

def get_sorted_files(src_dir, regex_ext='*', sort_reverse=False): 
    files_to_evaluate = [os.path.join(src_dir, f) for f in os.listdir(src_dir) if re.search(r'.*\.({})$'.format(regex_ext), f)]
    files_to_evaluate.sort(key=os.path.getmtime, reverse=sort_reverse)
    return files_to_evaluate
0
TXN_747