una todos rutas ruta renombrar obtener nombre masivamente los leer gestion directorio como carpeta borrar archivos archivo python file

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



renombrar archivos masivamente python (11)

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

¿Cuál es la mejor manera multiplataforma para obtener la fecha / hora de creación y modificación de archivos en Python?


En Python 3.4 y versiones posteriores, puede usar la interfaz del módulo pathlib orientado a objetos que incluye envoltorios para gran parte del módulo OS . Aquí hay un ejemplo de cómo obtener las estadísticas del archivo.

>>> import pathlib >>> fname = pathlib.Path(''test.py'') >>> assert fname.exists(), f''No such file: {fname}'' # check that the file exists >>> print(fname.stat()) os.stat_result(st_mode=33206, st_ino=5066549581564298, st_dev=573948050, st_nlink=1, st_uid=0, st_gid=0, st_size=413, st_atime=1523480272, st_mtime=1539787740, st_ctime=1523480272)

Para obtener más información sobre lo que contiene os.stat_result , consulte la documentación . Para la hora de modificación que desea fname.stat().st_mtime :

>>> import datetime >>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime) >>> print(mtime) datetime.datetime(2018, 10, 17, 10, 49, 0, 249980)

Si desea la hora de creación en Windows, o el cambio de metadatos más reciente en Unix, usaría fname.stat().st_ctime :

>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime) >>> print(ctime) datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)

Este artículo tiene información y ejemplos más útiles para el módulo pathlib.


Existen dos métodos para obtener el tiempo de modificación, os.path.getmtime () o os.stat (), pero el ctime no es confiable multiplataforma (ver más abajo).

os.path.getmtime()

getmtime ( ruta )
Devuelve el tiempo de última modificación de ruta. El valor de retorno es un número que da el número de segundos desde la época (consulte el módulo de tiempo). Aumente os.error si el archivo no existe o es inaccesible. Nuevo en la versión 1.5.2. Cambiado 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 )
Realizar una llamada al sistema stat () en la ruta dada. El valor de retorno es un objeto cuyos atributos corresponden a los miembros de la estructura estadística, a saber: st_mode (bits de protección), 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 (tiempo del acceso más reciente), st_mtime (tiempo de la modificación del contenido más reciente), st_ctime (depende de la plataforma; tiempo del cambio de metadatos más reciente en Unix, o el tiempo de 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 mtime y ctime, respectivamente.


La mejor función para usar para esto es os.path.getmtime() . Internamente, esto solo usa os.stat(filename).st_mtime .

El módulo datetime es la mejor marca de tiempo de manipulación, por lo que puede obtener la fecha de modificación como un objeto datetime 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)


Pude obtener el tiempo de creación en posix ejecutando el comando stat del sistema y analizando la salida.

commands.getoutput(''stat FILENAME'').split(''/"'')[7]

Ejecutar stat fuera de python desde Terminal (OS X) devolvió:

805306374 3382786932 -rwx------ 1 km staff 0 1098083 "Aug 29 12:02:05 2013" "Aug 29 12:02:05 2013" "Aug 29 12:02:20 2013" "Aug 27 12:35:28 2013" 61440 2150 0 testfile.txt

... donde la cuarta fecha / hora es la creación del archivo (en lugar de ctime change time como se observó en otros comentarios).


Si seguir los enlaces simbólicos no es importante, también puede usar el os.lstat .

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


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

Su 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 los sistemas * nix, sino a la última vez que cambiaron los datos del inodo. (Gracias a Kojiro por aclarar este hecho en los comentarios al proporcionar un enlace a una interesante publicación de blog)



os.stat devuelve una tupla nombrada con los atributos st_mtime y st_ctime . 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 el tiempo de creación en las plataformas POSIX.


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

Así que prueba esto:

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

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

Deberían ser iguales.


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

Obtener fechas de creación de archivos, por otro lado, es complicado y depende de la plataforma, diferenciándose incluso entre los tres grandes sistemas operativos:

Juntando todo esto, el código multiplataforma debería verse algo como esto ...

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://.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


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