Tengo un script que necesita hacer algunas cosas en función de la creación de archivos y las fechas de modificación, pero tiene que ejecutarse en Linux y Windows .
¿Cuál es la mejor forma multiplataforma para obtener la creación y modificación de archivos date/times
en Python ?
Respuestas:
Obtener algún tipo de fecha de modificación en una plataforma multiplataforma es fácil: solo 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 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:
ctime
(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ésos.path.getctime()
del.st_ctime
atributo del resultado de una llamada aos.stat()
. Esto no funcionará en Unix, dondectime
es la última vez que se modificaron los atributos o el contenido del archivo ..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, las
ext4
almacenanst_crtime
), el kernel de Linux no ofrece forma de acceder a ellas ; en particular, las estructuras que devuelve de lasstat()
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 de la fuente de Python . Al menos si está activadoext4
, los datos se adjuntan a los inodos en el sistema de archivos, pero no hay una forma conveniente de acceder a ellos.La siguiente mejor opción en Linux es acceder a los archivos
mtime
, a través de unoos.path.getmtime()
o el.st_mtime
atributo de unos.stat()
resultado. Esto le dará 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í ...
fuente
ext4
unidades con Linux, y me gustaría saber qué sucede cuando Linux lee archivos escritos por Windows, o viceversa, dado que se usan de manerast_ctime
diferente."w"
, no lo reemplaza, solo abre el archivo existente y lo trunca. A pesar de que el contenido del archivo no tiene relación alguna con lo que tenía en la creación, aún le dirían que el archivo fue "creado" mucho antes de la versión actual. Por el contrario, los editores que usan el reemplazo atómico al guardar (el archivo original se reemplaza por un nuevo archivo temporal de trabajo en progreso) mostrarían una fecha de creación más reciente, incluso si acaba de eliminar un carácter. Use el tiempo de modificación, no busque el tiempo de creación.stat.st_ctime
es más pertinente porque, en muchos casos, el momento del último cambio de metadatos puede ser el tiempo de creación (al menosctime
está más cerca del tiempo de creación real quemtime
). Por lo tanto, simplemente puede reemplazar su fragmento porstat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime
. ¿Qué piensas? Saludosctime
siempre debe ser igual o posterior amtime
, porque unmtime
cambio provoca unctime
cambio (porque elmtime
mismo se considera "metadatos"). Consulte stackoverflow.com/a/39521489/1709587 donde proporciono un código de ejemplo para ilustrar esto.Usted tiene un par de opciones. Por un lado, puede usar las funciones
os.path.getmtime
yos.path.getctime
:Su otra opción es usar
os.stat
: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 ese hecho en los comentarios al proporcionar un enlace a una publicación de blog interesante)fuente
ctime
que se actualiza cada vez que lamtime
hace (ya que elmtime
es "metadatos"), por lo que elctime
normalmente es siempre igual a o por delante de lamtime
. Tratarctime
como tiempo "creado" no tiene ningún sentido. -1!Last modified: Fri Jan 31 11:08:13 2020
yCreated: Fri Jan 31 11:08:13 2020
en Linux Ubuntu 16.04!time.ctime(os.path.getmtime(file))
devuelve 2 tipos de cadenas, dependiendo de si el archivo ha sido modificado por el sistema o por el usuario. Si ha sido modificado por el sistema, la cadena tendrá 2 espacios entre el mes y el día. No sé por quéLa mejor función a utilizar para esto es os.path.getmtime () . Internamente, esto solo usa
os.stat(filename).st_mtime
.El módulo de fecha y hora es la mejor marca de tiempo de manipulación, por lo que puede obtener la fecha de modificación como un
datetime
objeto como este:Ejemplo de uso:
fuente
getmtime
es lo más cercano disponible en Unix (donde no es posible obtener fechas de creación), pero definitivamente no es la mejor función para usar en Windows, dondectime
es un tiempo de creación.os.stat https://docs.python.org/2/library/stat.html#module-stat
editar: en el código más reciente, probablemente debería usar os.path.getmtime () (gracias Christian Oudard)
pero tenga en cuenta que devuelve un valor de coma flotante de time_t con fracción de segundo (si su sistema operativo lo admite)
fuente
os.path.getmtime()
ha existido desde Python 1.5.2 (ver los documentos antiguos ), lanzado antes de que perdiera la mayoría de mis dientes de leche y casi una década antes de que escribiera la versión original de esta respuesta.Hay dos métodos para obtener el tiempo de modificación, os.path.getmtime () o os.stat (), pero ctime no es confiable multiplataforma (ver más abajo).
os.path.getmtime ()
getmtime ( ruta )
Devuelve la hora de la última modificación de ruta. El valor de retorno es un número que proporciona el número de segundos desde la época (consulte el módulo de tiempo). Levante os.error si el archivo 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 coma flotante.
os.stat ()
stat ( ruta )
Realiza 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 (hora del acceso más reciente), st_mtime (hora de la modificación de contenido más reciente), st_ctime (depende de la plataforma; hora del cambio de metadatos más reciente en Unix, o el momento de la creación en Windows) :
En el ejemplo anterior, usaría statinfo.st_mtime o statinfo.st_ctime para obtener mtime y ctime, respectivamente.
fuente
En Python 3.4 y versiones posteriores, puede usar la interfaz del módulo pathlib orientada 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.
Para obtener más información sobre lo que
os.stat_result
contiene, consulte la documentación . Para el tiempo de modificación que deseefname.stat().st_mtime
:Si desea el tiempo de creación en Windows, o el cambio de metadatos más reciente en Unix, usaría
fname.stat().st_ctime
:Este artículo tiene más información útil y ejemplos para el módulo pathlib.
fuente
os.stat
devuelve una tupla con nombre const_mtime
yst_ctime
atributos. El tiempo de modificación esst_mtime
en ambas plataformas; desafortunadamente, en Windowsctime
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.fuente
dir(..)
una. Por ejemplodir(os.stat(os.listdir('.')[0]))
huellas dactilares
fuente
fuente
Si seguir enlaces simbólicos no es importante, también puede usar el
os.lstat
builtin incorporado.fuente
Puede valer la pena echar un vistazo a la
crtime
biblioteca que implementa el acceso multiplataforma al tiempo de creación de archivos.fuente
debugfs
en Linux, que por definición es inestable, requiere acceso de raíz de nivel superior para todo y en casi todos los aspectos tiende a ser una de las cosas que su madre siempre le advirtió. (Pero sí, probablemente funcione si estás realmente desesperado y eres el superusuario real en un sistema sin arranque seguro ...)os.stat
incluye el tiempo de creación. Simplemente no hay una definición de st_anything para el elementoos.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.
fuente
Pude obtener el tiempo de creación en posix ejecutando el comando stat del sistema y analizando la salida.
La ejecución de estadísticas fuera de Python desde la Terminal (OS X) devolvió:
... donde la cuarta fecha y hora es la creación del archivo (en lugar de la hora de cambio de ctime como se señaló en otros comentarios).
fuente