¿Cuál es la mejor manera de obtener una lista de todos los archivos en un directorio, ordenados por fecha [creado | modificado], utilizando Python, en una máquina con Windows?
129
Actualización : para ordenar dirpath
las entradas por fecha de modificación en Python 3:
import os
from pathlib import Path
paths = sorted(Path(dirpath).iterdir(), key=os.path.getmtime)
( Pon la respuesta de @ Pygirl aquí para una mayor visibilidad)
Si ya tiene una lista de nombres de archivo files
, entonces ordénela por hora de creación en Windows:
files.sort(key=os.path.getctime)
La lista de archivos que puede obtener, por ejemplo, utilizando glob
como se muestra en la respuesta de @ Jay .
respuesta anterior
Aquí hay una versión más detallada de @Greg Hewgill
la respuesta de . 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
cdate
es un número flotante de segundos desde Epoch.stat
una vez por dir.entry.He hecho esto en el pasado para un script de Python para determinar los últimos archivos actualizados en un directorio:
Eso debería hacer lo que estás buscando en función del archivo mtime.
EDITAR : tenga en cuenta que también puede usar os.listdir () en lugar de glob.glob () si lo deseaba; la razón por la que usé glob en mi código original fue que quería usar glob para buscar solo archivos con un conjunto particular de extensiones de archivo, que glob () se adapta mejor a. Para usar listdir, así es como se vería:
fuente
files.sort(key=lambda fn: os.path.getmtime(os.path.join(search_dir, fn)))
files.sort(key=os.path.getmtime)
debería funcionar (sinlambda
).Hay una
os.path.getmtime
función que da la cantidad de segundos desde la época y debería ser más rápida queos.stat
.fuente
Aquí está mi versión:
Primero, creamos una lista de los nombres de los archivos. isfile () se usa para omitir directorios; se puede omitir si se deben incluir directorios. Luego, clasificamos la lista en el lugar, usando la fecha de modificación como clave.
fuente
a[-5:]
Aquí hay una frase:
Esto llama a os.listdir () para obtener una lista de los nombres de archivo, luego llama a os.stat () para que cada uno obtenga el tiempo de creación, luego se compara con el tiempo de creación.
Tenga en cuenta que este método solo llama a os.stat () una vez para cada archivo, lo que será más eficiente que llamarlo para cada comparación en una especie.
fuente
Sin cambiar de directorio:
fuente
En python 3.5+
fuente
f.stat().st_ctime
en su lugar.Aquí está mi respuesta usando glob sin filtro si desea leer archivos con una cierta extensión en orden de fecha (Python 3).
fuente
fuente
Podría usar en
os.walk('.').next()[-1]
lugar de filtrar conos.path.isfile
, pero eso deja enlaces simbólicos muertos en la lista yos.stat
fallará en ellos.fuente
o
o
donde m tiempo es tiempo modificado.
fuente
Este es un paso básico para aprender:
fuente
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:
Cuando el archivo no existe, se usa now (), y el enlace simbólico irá al final de la lista.
fuente
Aquí hay un par de líneas simples que buscan la extensión y proporcionan una opción de clasificación
fuente
Para completar con
os.scandir
(2 veces más rápidopathlib
):fuente
Esta fue mi versión:
fuente
Tal vez deberías usar comandos de shell. En Unix / Linux, find piped with sort probablemente podrá hacer lo que quiera.
fuente