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 https://docs.python.org/2/library/stat.html#module-stat
edición: en el código más reciente probablemente deberías usar os.path.getmtime() (gracias Christian Oudard)
pero tenga en cuenta que devuelve un valor de punto flotante de time_t con fracción de segundos (si su sistema operativo lo admite)
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:
- En Windows , el
ctime
un archivo (documentado en https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) almacena su fecha de creación. Puede acceder a esto en Python a través deos.path.getctime()
o el atributo.st_ctime
del resultado de una llamada aos.stat()
. Esto no funcionará en Unix, dondectime
es la última vez que se cambiaron los atributos o el contenido del archivo . - En Mac , así como en otros sistemas operativos basados en Unix, puede usar el atributo
.st_birthtime
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
almacena enst_crtime
), el kernel de Linux no ofrece ninguna forma de acceder a ellos ; en particular, las estructuras que devuelve de las llamadasstat()
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 se encuentra actualmente en ninguna parte en la fuente de Python . Al menos si está enext4
, los datos se adjuntan a los inodos en el sistema de archivos, pero no hay una forma conveniente de acceder a ellos.Lo mejor en Linux es acceder al
mtime
del archivo, a través de os.path.getmtime(path) o el atributo.st_mtime
de un resultadoos.stat()
. Esto le dará la última vez que se modificó el contenido del archivo, lo que puede ser adecuado para algunos casos de uso.
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
>>>