Pregunta ¿Cómo obtener la fecha / hora de creación y modificación de archivos en Python?


Tengo un script que necesita hacer algunas cosas en base a las fechas de creación y modificación de archivos, pero tiene que ejecutarse en Linux y Windows.

Que es lo mejor multiplataforma forma de obtener la creación de archivo y la fecha / hora de modificación en Python?


686
2017-10-25 21:54


origen


Respuestas:


Obtener un tipo de fecha de modificación de forma multiplataforma es fácil: solo llame os.path.getmtime(camino) y obtendrá la marca de tiempo de Unix de cuando el archivo en path fue modificado por última vez.

Obteniendo archivo creación las fechas, por otro lado, son complicadas y dependientes de la plataforma, que difieren incluso entre los tres sistemas operativos grandes:

Poniendo todo esto junto, el código multiplataforma debería verse más o menos 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

316
2017-09-14 23:51



Usted tiene un par de opciones. Para uno, puedes usar el os.path.getmtime y os.path.getctime funciones:

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() hace no consulte el tiempo de creación en los sistemas * nix, pero más bien la última vez que los datos del inodo cambiaron. (Gracias a kojiro por hacer ese hecho más claro en los comentarios al proporcionar un enlace a una publicación de blog interesante)


611
2017-10-25 22:00



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

340
2017-10-06 14:51



os.stat https://docs.python.org/2/library/stat.html#module-stat

editar: en un código más nuevo probablemente deberías usar os.path.getmtime () (gracias Christian Oudard)
 pero tenga en cuenta que devuelve un valor en coma flotante de time_t con fracciones de segundo (si su sistema operativo lo admite)


46
2017-10-25 21:58



Hay dos métodos para obtener el tiempo de mod, os.path.getmtime () u os.stat (), pero el ctime no es confiable multiplataforma (ver a continuación).

os.path.getmtime ()

getmtime(camino)
Devuelve la hora de la última modificación de la ruta. El valor de retorno es un número que da el número de segundos desde la época (ver el módulo de tiempo). Levanta os.error si el archivo no no existe o es inaccesible Nuevo en la versión 1.5.2. Modificado en la versión 2.3: si os.stat_float_times () devuelve True, el resultado es un número de punto flotante.

os.stat ()

stat(camino)
Realice una llamada al sistema stat () en la ruta especificada. El valor de retorno es un objeto cuya atributos corresponden a los miembros de la estructura estadística, a saber: st_mode (protección bits), st_ino (número de inodo), st_dev (dispositivo), st_nlink (número de enlaces duros), st_uid (ID de usuario del propietario), st_gid (ID de grupo del propietario), st_size (tamaño del archivo, en bytes), st_atime (hora del acceso más reciente), st_mtime (hora del contenido más reciente modificación), st_ctime (depende de la plataforma; la hora del cambio más reciente de metadatos en Unix, o el momento de la creación en Windows):

>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>> 

En el ejemplo anterior, usaría statinfo.st_mtime o statinfo.st_ctime para obtener el mtime y el ctime, respectivamente.


35
2017-10-25 22:05



os.stat devuelve una tupla con nombre st_mtime y st_ctime atributos. El tiempo de modificación es st_mtime en ambas plataformas; desafortunadamente, en Windows, ctime significa "tiempo de creación", mientras que en POSIX significa "tiempo de cambio". No conozco ninguna forma de obtener tiempo de creación en plataformas POSIX.


11
2017-10-25 22:06



>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 

2
2017-10-25 22:07



Si los siguientes enlaces simbólicos no son importantes, también puede usar os.lstat incorporado.

>>> os.lstat("2048.py")
posix.stat_result(st_mode=33188, st_ino=4172202, st_dev=16777218L, st_nlink=1, st_uid=501, st_gid=20, st_size=2078, st_atime=1423378041, st_mtime=1423377552, st_ctime=1423377553)
>>> os.lstat("2048.py").st_atime
1423378041.0

1
2018-02-11 00:13



os.stat incluye el tiempo de creación Simplemente no hay definición de st_anything para el elemento de os.stat() que contiene el tiempo

Entonces intente esto:

os.stat('feedparser.py')[8]

Compare eso con su fecha de creación en el archivo en ls -lah

Deberían ser iguales.


0
2017-12-14 23:39