¿Cómo obtengo la fecha/hora de creación y modificación de archivos?

Resuelto Mark Biek asked hace 16 años • 13 respuestas

¿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?

Mark Biek avatar Oct 26 '08 04:10 Mark Biek
Aceptado

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és os.path.getctime()del .st_ctimeatributo del resultado de una llamada a os.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_birthtimeatributo del resultado de una llamada a os.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, ext4las almacenan en st_crtime), el kernel de Linux no ofrece forma de acceder a ellas ; en particular, las estructuras que devuelve de stat()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 identificador st_crtimeno aparece actualmente en ninguna parte del código fuente de Python . Al menos si está activado ext4, 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és os.path.getmtime()del .st_mtimeatributo de un os.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
Mark Amery avatar Sep 14 '2016 23:09 Mark Amery

Usted tiene un par de opciones. Por un lado, puedes usar las funciones os.path.getmtimey 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).

Bryan Oakley avatar Oct 25 '2008 22:10 Bryan Oakley

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 datetimeobjeto 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)
Christian Oudard avatar Oct 06 '2009 14:10 Christian Oudard