2009-06-03 26 views
8

os.path.getctime de Python en la Mac (y bajo Unix en general) no da la fecha cuando se creó un archivo sino "la hora del último cambio" (según el documentos al menos). Por otro lado, en el Finder puedo ver el tiempo real de creación del archivo, por lo que HFS + guarda esta información.Obtener tiempo de creación de archivos con Python en Mac

¿Tiene alguna sugerencia sobre cómo obtener la hora de creación del archivo en la Mac en un programa de Python?

+0

duplicado: http://stackoverflow.com/questions/237079/how-to-get-file-creation-modification-date-times-in-python –

+1

@ S.Lott : no realmente, dado que obtener la hora de creación del archivo en una Mac es inherentemente no multiplataforma. – Miles

+0

@Miles: tal vez sea cierto, pero la respuesta se aplica perfectamente a esta pregunta. –

Respuesta

14

utilizar la propiedad st_birthtime en el resultado de una llamada a os.stat() (o fstat/lstat).

def get_creation_time(path): 
    return os.stat(path).st_birthtime 

puede convertir el resultado entero a un objeto de fecha y hora utilizando datetime.datetime.fromtimestamp().

Por alguna razón, no creo que esto funcionó en Mac OS X cuando se escribió esta respuesta por primera vez, pero podría estar equivocado, y funciona ahora, incluso con versiones anteriores de Python. La respuesta anterior está abajo para la posteridad.


Usando ctypes acceder a la llamada al sistema stat64 (trabaja con Python 2.5 +):

from ctypes import * 

class struct_timespec(Structure): 
    _fields_ = [('tv_sec', c_long), ('tv_nsec', c_long)] 

class struct_stat64(Structure): 
    _fields_ = [ 
     ('st_dev', c_int32), 
     ('st_mode', c_uint16), 
     ('st_nlink', c_uint16), 
     ('st_ino', c_uint64), 
     ('st_uid', c_uint32), 
     ('st_gid', c_uint32), 
     ('st_rdev', c_int32), 
     ('st_atimespec', struct_timespec), 
     ('st_mtimespec', struct_timespec), 
     ('st_ctimespec', struct_timespec), 
     ('st_birthtimespec', struct_timespec), 
     ('dont_care', c_uint64 * 8) 
    ] 

libc = CDLL('libc.dylib') # or /usr/lib/libc.dylib 
stat64 = libc.stat64 
stat64.argtypes = [c_char_p, POINTER(struct_stat64)] 

def get_creation_time(path): 
    buf = struct_stat64() 
    rv = stat64(path, pointer(buf)) 
    if rv != 0: 
     raise OSError("Couldn't stat file %r" % path) 
    return buf.st_birthtimespec.tv_sec 

Usando subprocess a llamar a la utilidad stat:

import subprocess 

def get_creation_time(path): 
    p = subprocess.Popen(['stat', '-f%B', path], 
     stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    if p.wait(): 
     raise OSError(p.stderr.read().rstrip()) 
    else: 
     return int(p.stdout.read()) 
+0

¡Perfecto! Esto es exactamente lo que estaba buscando. – cefstat

+1

En El Capitan, es posible que desee utilizar 'libc = CDLL ('/ usr/lib/libc.dylib')' en lugar de 'libc = CDLL ('libc.dylib')' si obtiene un 'OSError: dlopen (libc.dylib, 6): imagen no encontrada'. –

+0

@ThomasOrozco Resulta que hay un mejor enfoque que ctypes de todos modos. – Miles

1

ctime difiere en la plataforma: En algunos sistemas (como Unix) es el momento del último cambio de metadatos y, en otros (como Windows), es el tiempo de creación. Esto se debe a que las Unidades generalmente no conservan el tiempo de creación "original".

Dicho esto, puede acceder a toda la información que el sistema operativo proporciona con el módulo stat.

The stat module defines constants and functions for interpreting the results of os.stat(), os.fstat() and os.lstat() (if they exist). For complete details about the stat, fstat and lstat calls, consult the documentation for your system.

stat.ST_CTIME
The “ctime” as reported by the operating system. On some systems (like Unix) is the time of the last metadata change, and, on others (like Windows), is the creation time (see platform documentation for details).

+0

Gracias pero ... stat.ST_CTIME: El "ctime" según lo informado por el sistema operativo. En algunos sistemas (como Unix) es el momento del último cambio de metadatos y, en otros (como Windows), es el momento de la creación (consulte la documentación de la plataforma para obtener más información). – cefstat

+1

@cefstat Ese es el punto. Algunos sistemas (como unices) simplemente no proporcionan el tiempo de creación "original". No hay nada que Python pueda hacer al respecto. – lothar

Cuestiones relacionadas