¿Cuál es la mejor manera de obtener una lista de todos los archivos en un directorio, ordenados por fecha [creado | modified], using python, en una máquina de Windows?¿Cómo se obtiene una lista de directorios ordenados por fecha de creación en python?
Respuesta
Aquí hay una versión más detallada de @Greg Hewgill
's answer. 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
He hecho esto en el pasado por 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á buscando basado en -mtime archivo.
EDITAR: Tenga en cuenta que también se puede utilizar os.listdir() en lugar de glob.glob() si lo desea - la razón por la que solía pegote en mi código original era que yo quería utilizar a glob única búsqueda para archivos con un conjunto particular de extensiones de archivo, para lo cual glob() era más adecuado. 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))
glob() es agradable, pero hay que tener en cuenta que omite los archivos a partir de un período. * Los sistemas nix tratan estos archivos como ocultos (omitiéndolos de los listados), pero en Windows son archivos normales. – efotinis
Estas soluciones no excluyen los directorios de la lista. – Constantin
Su solución os.listdir falta el archivo os.path.join: files.sort (lambda x, y: cmp (os.path.getmtime (os.path.join (search_dir, x)), os.path. getmtime (os.path.join (search_dir, y)))) –
Tal vez debería usar comandos de shell. En Unix/Linux, find hilo con sort probablemente podrá hacer lo que quieras.
Aquí hay una sola línea:
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 exige os.listdir() para obtener una lista de los nombres de archivo, a continuación, llama os.stat() para cada uno para obtener la hora de creación, a continuación, ordena contra el 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.
que es apenas pitónico, aunque resuelve el trabajo (descargo de responsabilidad: no se probó el código). –
Esta solución no excluye los directorios de la lista. – Constantin
@Constantin: eso es cierto, pero un rápido [... si stat.S_ISREG (x)] manejaría eso. –
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
En primer lugar, construimos una lista de los nombres de archivo. 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.
sorted(filter(os.path.isfile, os.listdir('.')),
key=lambda p: os.stat(p).st_mtime)
Usted podría utilizar os.walk('.').next()[-1]
en lugar de filtrado con os.path.isfile
, pero que deja muertos enlaces simbólicos en la lista, y os.stat
se producirá un error en ellos.
Eso solo funciona en el directorio actual. – Tom
hay una función os.path.getmtime
que da el número de segundos desde la época y debe ser más rápido que os.stat.
os.chdir(directory)
sorted(filter(os.path.isfile, os.listdir('.')), key=os.path.getmtime)
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í está mi respuesta usando pegote sin filtro si desea leer los archivos con una extensión determinada en orden cronológico (Python 3).
dataset_path='/mydir/'
files = glob.glob(dataset_path+"/morepath/*.extension")
files.sort(key=os.path.getmtime)
Sin cambiar de 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
la respuesta de Alex Coventry producirá una excepción si el archivo es un enlace simbólico a un archivo unexistent, 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.
en Python 3.5+
from pathlib import Path
sorted(Path('.').iterdir(), key=lambda f: f.stat().st_mtime)
- 1. Ordene (y enumere) la lista de directorios por fecha de creación del archivo?
- 2. Ordenar archivos por fecha de creación - iOS
- 3. vb.net ¿cómo recorrer una lista de directorios?
- 4. ¿Cómo se obtiene una lista de directorio en C?
- 5. Obtener archivos por fecha de creación en .NET
- 6. Lista de directorios con una profundidad especificada en Python
- 7. Uso ordenados() en Python
- 8. archivos de lista dired ordenados por tiempo de acceso
- 9. lista parcial de directorios
- 10. android, cómo obtener una lista de directorios?
- 11. ¿Cómo se obtiene una lista de todas las fuentes instaladas?
- 12. ¿Supervisa la lista de directorios por cambios?
- 13. Obtenga una gran lista de archivos, ordenados por tiempo de archivo en * milisegundos *
- 14. ¿Cómo se obtiene una lista de cambios de un repositorio de Subversion por rango de fechas?
- 15. Python/Django: Creación de una lista simple de values_list()
- 16. directorios de lista en una carpeta, ignoran sub directorios ANT
- 17. Usando Node.JS, ¿cómo se obtiene una lista de archivos en orden cronológico?
- 18. ¿Cómo se obtiene la fecha máxima posible en Oracle?
- 19. Fecha de creación en JavaDoc
- 20. ¿Cómo se analiza una cadena de fecha HTTP en Python?
- 21. ¿Cómo recuperar una lista de directorios RÁPIDAMENTE en Java?
- 22. cómo utilizar coredata a buscar una lista de lugares ordenados por distancia
- 23. La clasificación de archivos por fecha de creación/modificación en PHP
- 24. ¿Cómo obtengo una lista de directorios en Perl?
- 25. Dividir una lista por fecha distinta
- 26. ¿Obtiene la lista de procedimientos almacenados creados y/o modificados en una fecha determinada?
- 27. Obtener la lista de aplicaciones en ejecución ordenados por último uso
- 28. Lista de directorios basada en el tiempo
- 29. Guarde solo N últimos registros en la base de datos SQLite, ordenados por fecha
- 30. Delphi 6: ¿Cómo puedo cambiar la fecha de creación del archivo (= fecha de creación del archivo)
Esto funcionó perfectamente. Estoy tratando de comparar dos directorios cdate con el otro. ¿Hay alguna forma de comparar los segundos entre las dos cdates? – Federer
@malcmcmul: 'cdate' es un número flotante de segundos desde Epoch. – jfs
Esto funciona, pero la solución más sucinta es http://stackoverflow.com/a/4500607/68534 – jmoz