installed python windows directory

installed - ¿Cómo se obtiene una lista de directorios ordenada por fecha de creación en python?



python path windows (12)

¿Cuál es la mejor manera de obtener una lista de todos los archivos en un directorio, ordenados por fecha [creada | modified], using python, en una máquina de Windows?


Aquí está mi respuesta usando glob sin filtro si quieres leer archivos con una cierta extensión en el orden de fecha (Python 3).

dataset_path=''/mydir/'' files = glob.glob(dataset_path+"/morepath/*.extension") files.sort(key=os.path.getmtime)


Aquí está mi versión:

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

Primero, construimos una lista de los nombres de los archivos. isfile () se usa para omitir directorios; se puede omitir si se deben incluir directorios. Luego, ordenamos la lista en el lugar, usando la fecha de modificación como la clave.


Aquí hay un trazador de líneas:

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

Esto llama a os.listdir () para obtener una lista de los nombres de los archivos, luego llama a os.stat () para que cada uno obtenga el tiempo de creación, luego ordena en contra del tiempo de creación.

Tenga en cuenta que este método solo llama a os.stat () una vez para cada archivo, que será más eficiente que llamarlo para cada comparación en una ordenación.


En Python 3.5+

from pathlib import Path sorted(Path(''.'').iterdir(), key=lambda f: f.stat().st_mtime)


Hay una función os.path.getmtime que da la cantidad de segundos desde la época y debe ser más rápida que os.stat.

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


La respuesta de Alex Coventry producirá una excepción si el archivo es un enlace simbólico a un archivo inexistente, el siguiente código corrige esa respuesta:

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

Cuando el archivo no existe, ahora se usa () y el enlace simbólico irá al final de la lista.


Sin cambiar el directorio:

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


Tal vez deberías usar comandos de shell. En Unix / Linux, find hilo con sort probablemente podrá hacer lo que quieras.


Ya he hecho esto en el pasado para una secuencia de comandos de Python para determinar los últimos archivos actualizados en un directorio:

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

Eso debería hacer lo que estás buscando según el mtime del archivo.

EDITAR : Tenga en cuenta que también puede usar os.listdir () en lugar de glob.glob () si lo desea, la razón por la que utilicé glob en mi código original fue porque quería usar glob para buscar solo archivos con un conjunto particular. de extensiones de archivo, a las que se ajustó glob (). Para usar listdir, aquí está lo que se vería:

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


este es un paso básico para aprender:

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


Aquí hay una versión más detallada de la @Greg Hewgill de @Greg Hewgill . Es el más conforme a los requisitos de la pregunta. Hace una distinción entre las fechas de creación y modificación (al menos en 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)

Ejemplo:

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


sorted(filter(os.path.isfile, os.listdir(''.'')), key=lambda p: os.stat(p).st_mtime)

Puede usar os.walk(''.'').next()[-1] lugar de filtrar con os.path.isfile , pero eso deja enlaces simbólicos muertos en la lista, y os.stat fallará en ellos.