2008-10-03 21 views

Respuesta

41

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 
+0

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

+0

@malcmcmul: 'cdate' es un número flotante de segundos desde Epoch. – jfs

+3

Esto funciona, pero la solución más sucinta es http://stackoverflow.com/a/4500607/68534 – jmoz

87

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

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

+0

Estas soluciones no excluyen los directorios de la lista. – Constantin

+0

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

-4

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

17

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.

+0

que es apenas pitónico, aunque resuelve el trabajo (descargo de responsabilidad: no se probó el código). –

+0

Esta solución no excluye los directorios de la lista. – Constantin

+0

@Constantin: eso es cierto, pero un rápido [... si stat.S_ISREG (x)] manejaría eso. –

15

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.

4
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.

+0

Eso solo funciona en el directorio actual. – Tom

13

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

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 
8

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

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 
1

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.

1

en Python 3.5+

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