¿Cómo obtengo la fecha/hora de creación y modificación de archivos?
¿Cuál es la mejor forma multiplataforma de obtener fechas/horas de creación y modificación de archivos, que funcione tanto en Linux como en Windows?
Obtener algún tipo de fecha de modificación de forma multiplataforma es fácil: simplemente llame y obtendrá la marca de tiempo de Unix de cuándo se modificó por última vez el archivo.os.path.getmtime(path)
path
Obtener las fechas de creación de archivos , por otro lado, es complicado y depende de la plataforma, y difiere incluso entre los tres grandes sistemas operativos:
- En Windows , un archivo
ctime
(documentado en https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) almacena su fecha de creación. Puedes acceder a esto en Python a travésos.path.getctime()
del.st_ctime
atributo del resultado de una llamada aos.stat()
. Esto no funcionará en Unix, donde es la última vez que se cambiaron los atributos octime
el contenido del archivo . - En Mac , así como en otros sistemas operativos basados en Unix, puede utilizar el
.st_birthtime
atributo del resultado de una llamada aos.stat()
. En Linux , esto es actualmente imposible, al menos sin escribir una extensión C para Python. Aunque algunos sistemas de archivos comúnmente utilizados con Linux almacenan fechas de creación (por ejemplo,
ext4
las almacenan enst_crtime
), el kernel de Linux no ofrece forma de acceder a ellas ; en particular, las estructuras que devuelve destat()
llamadas en C, a partir de la última versión del kernel, no contienen ningún campo de fecha de creación . También puede ver que el identificadorst_crtime
no aparece actualmente en ninguna parte del código fuente de Python . Al menos si está activadoext4
, los datos se adjuntan a los inodos en el sistema de archivos, pero no hay una manera conveniente de acceder a ellos.La mejor opción en Linux es acceder al archivo
mtime
, a travésos.path.getmtime()
del.st_mtime
atributo de unos.stat()
resultado. Esto le indicará la última vez que se modificó el contenido del archivo, lo que puede ser adecuado para algunos casos de uso.
Poniendo todo esto junto, el código multiplataforma debería verse así...
import os
import platform
def creation_date(path_to_file):
"""
Try to get the date that a file was created, falling back to when it was
last modified if that isn't possible.
See http://stackoverflow.com/a/39501288/1709587 for explanation.
"""
if platform.system() == 'Windows':
return os.path.getctime(path_to_file)
else:
stat = os.stat(path_to_file)
try:
return stat.st_birthtime
except AttributeError:
# We're probably on Linux. No easy way to get creation dates here,
# so we'll settle for when its content was last modified.
return stat.st_mtime
Usted tiene un par de opciones. Por un lado, puedes usar las funciones os.path.getmtime
y os.path.getctime
:
import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))
Tu otra opción es usar os.stat
:
import os, time
(mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file)
print("last modified: %s" % time.ctime(mtime))
Nota : ctime()
no se refiere al tiempo de creación en sistemas *nix, sino a la última vez que cambiaron los datos del inodo . (Gracias a Kojiro por aclarar ese hecho en los comentarios al proporcionar un enlace a una publicación de blog interesante).
La mejor función para usar para esto es os.path.getmtime() . Internamente, esto solo usa os.stat(filename).st_mtime
.
El módulo de fecha y hora es el mejor para manipular marcas de tiempo, por lo que puede obtener la fecha de modificación como un datetime
objeto como este:
import os
import datetime
def modification_date(filename):
t = os.path.getmtime(filename)
return datetime.datetime.fromtimestamp(t)
Ejemplo de uso:
>>> d = modification_date('/var/log/syslog')
>>> print d
2009-10-06 10:50:01
>>> print repr(d)
datetime.datetime(2009, 10, 6, 10, 50, 1)