
En Python, vous pouvez utiliser les modules de bibliothèque standard os et pathlib pour obtenir des horodatages tels que la création, la modification et la date et l’heure d’accès des fichiers. Il peut être obtenu en heure Unix (Epoch time, Posix time) mais peut être converti en date et heure à l’aide du module datetime.
Vous pouvez obtenir les horodatages suivants. La signification diffère selon le système d’exploitation, soyez donc particulièrement attentif au temps de création.
- atime : temps d’accès
- mtime : heure de modification
- ctime : Modifier l’heure (Unix) et l’heure de création (Windows)
- date de naissance : heure de création (certains Unix de la famille FreeBSD, y compris macOS)
Cet article décrit le contenu suivant.
- Obtenir os.stat_result avec des informations d’horodatage
- Chemin.stat()
- os.stat()
- Attributs de os.stat_result
- Obtenir des horodatages avec la fonction os.path
- Convertir l’horodatage en date-heure
- Type d’horodatage : atime, ctime, mtime, birthtime
- Obtenir la date et l’heure de modification
- Obtenir la date et l’heure de création
Par exemple, créez un fichier et mettez-le à jour après 10 secondes.
import os
import pathlib
import datetime
import time
import platform
p = pathlib.Path('data/temp/test.txt')
p.write_text('test')
time.sleep(10)
p.write_text('update')
Obtenir os.stat_result avec des informations d’horodatage
Vous pouvez obtenir des métadonnées de fichier, telles que des horodatages, en tant qu’attributs de l’objet os.stat_result.
Chemin.stat()
Vous pouvez obtenir l’objet os.stat_result avec la méthode stat() de l’objet pathlib.Path.
print(p.stat())
# os.stat_result(st_mode=33188, st_ino=8728494137, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=6, st_atime=1549094615, st_mtime=1549094615, st_ctime=1549094615)
print(type(p.stat()))
# <class 'os.stat_result'>
os.stat()
Vous pouvez également utiliser la fonction os.stat() du module os pour obtenir l’objet os.stat_result. L’argument peut être une chaîne de chemin ou un objet pathlib.Path (Python 3.6 ou version ultérieure).
print(os.stat('data/temp/test.txt'))
# os.stat_result(st_mode=33188, st_ino=8728494137, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=6, st_atime=1549094615, st_mtime=1549094615, st_ctime=1549094615)
print(type(os.stat('data/temp/test.txt')))
# <class 'os.stat_result'>
print(os.stat(p))
# os.stat_result(st_mode=33188, st_ino=8728494137, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=6, st_atime=1549094615, st_mtime=1549094615, st_ctime=1549094615)
print(type(os.stat(p)))
# <class 'os.stat_result'>
Toutes les méthodes vous donnent le même objet os.stat_result.
print(p.stat() == os.stat('data/temp/test.txt') == os.stat(p))
# True
Attributs de os.stat_result
Vous pouvez obtenir des horodatages avec les attributs st_atime, st_mtime et st_ctime de l’objet os.stat_result. Sur certains systèmes Unix de la famille FreeBSD, y compris macOS, il existe également un attribut st_birthtime. La signification de chacun est décrite plus loin.
st = p.stat()
print(st.st_atime)
# 1549094615.972488
print(st.st_mtime)
# 1549094615.9723485
print(st.st_ctime)
# 1549094615.9723485
print(st.st_birthtime)
# 1549094605.9650702
Tous les attributs sont des nombres à virgule flottante et représentent l’heure Unix (Epoch time, Posix time). La conversion de cette valeur en date/heure est décrite plus loin.
print(type(st.st_ctime))
# <class 'float'>
Il existe également st_atime_ns, st_ctime_ns et st_mtime_ns qui stockent la valeur d’un entier int en nanosecondes. Il n’y a pas d’attribut équivalent pour st_birthtime.
print(st.st_ctime_ns)
# 1549094615972348510
print(type(st.st_ctime_ns))
# <class 'int'>
Notez que, comme indiqué dans la documentation officielle, le nombre à virgule flottante float contient des informations après la virgule et xxx_ns stocke les valeurs en nanosecondes, mais la précision n’est pas garantie.
La signification exacte et la résolution des attributs st_atime, st_mtime et st_ctime dépendent du système d’exploitation et du système de fichiers. Par exemple, sur les systèmes Windows utilisant les systèmes de fichiers FAT ou FAT32, st_mtime a une résolution de 2 secondes et st_atime n’a qu’une résolution de 1 jour. Consultez la documentation de votre système d’exploitation pour plus de détails.
os — Diverses interfaces de système d’exploitation — Documentation Python 3.10.0
os.stat_result possède divers autres attributs, tels que st_size, qui indique la taille du fichier en octets. Consultez l’article suivant sur l’obtention de la taille des fichiers et des dossiers.
Obtenir des horodatages avec la fonction os.path
Vous pouvez également obtenir des horodatages avec la fonction os.path, getatime(), getmtime() et getctime().
print(os.path.getatime('data/temp/test.txt'))
# 1549094615.972488
print(os.path.getmtime('data/temp/test.txt'))
# 1549094615.9723485
print(os.path.getctime('data/temp/test.txt'))
# 1549094615.9723485
Dans Python 3.6 ou version ultérieure, vous pouvez également spécifier l’objet pathlib.Path comme argument au lieu d’une chaîne de chemin.
print(os.path.getctime(p))
# 1549094615.9723485
Comme vous pouvez le voir dans le code source, ces fonctions obtiennent simplement les attributs correspondants de os.stat_result.
def getmtime(filename):
"""Return the last modification time of a file, reported by os.stat()."""
return os.stat(filename).st_mtime
def getatime(filename):
"""Return the last access time of a file, reported by os.stat()."""
return os.stat(filename).st_atime
def getctime(filename):
"""Return the metadata change time of a file, reported by os.stat()."""
return os.stat(filename).st_ctime
Bien sûr, vous pouvez obtenir exactement la même valeur qu’en obtenant os.stat_result avec Path.stat() ou os.stat() et en spécifiant son attribut.
print(os.path.getctime(p) == p.stat().st_ctime)
# True
Les fonctions pour obtenir st_atime_ns, st_ctime_ns, st_mtime_ns et st_birthtime ne sont pas fournies.
Convertir l’horodatage en date-heure
Comme dans l’exemple de code précédent, l’horodatage est exprimé en heure Unix (heure Epoch, heure Posix).
Pour le convertir en objet datetime, utilisez la fonction datetime.fromtimestamp() du module datetime.
dt = datetime.datetime.fromtimestamp(p.stat().st_ctime)
print(dt)
# 2019-02-02 17:03:35.972348
print(type(dt))
# <class 'datetime.datetime'>
Pour plus d’informations, notamment sur la manière de spécifier le fuseau horaire lors de la conversion, consultez l’article suivant.
L’objet datetime peut être converti en une chaîne dans n’importe quel format ou format ISO.
print(dt.strftime('%Y年%m月%d日 %H:%M:%S'))
# 2019年02月02日 17:03:35
print(dt.isoformat())
# 2019-02-02T17:03:35.972348
Type d’horodatage : atime, ctime, mtime, birthtime
Comme mentionné dans l’introduction, il existe différents types d’horodatages : atime, ctime, mtime et birthtime.
- atime : temps d’accès
- mtime : heure de modification
- ctime : Modifier l’heure (Unix) et l’heure de création (Windows)
- date de naissance : heure de création (certains Unix de la famille FreeBSD, y compris macOS)
Voir la page suivante pour plus de détails.
Obtenir la date et l’heure de modification
Pour le soi-disant temps de modification, vous pouvez obtenir mtime quel que soit le système d’exploitation.
Utilisez l’attribut st_mtime de os.stat_result ou la fonction os.path.getmtime() comme dans l’exemple de code jusqu’à présent.
print(os.path.getmtime('data/temp/test.txt'))
# 1549094615.9723485
print(p.stat().st_mtime)
# 1549094615.9723485
Pour le convertir en objet datetime, utilisez la fonction datetime.fromtimestamp() du module datetime.
print(datetime.datetime.fromtimestamp(p.stat().st_mtime))
# 2019-02-02 17:03:35.972348
Sous Unix, vous pouvez utiliser ctime pour obtenir l’heure de la dernière modification des métadonnées, donc si vous voulez détecter les changements de nom de fichier, par exemple, utilisez ctime au lieu de mtime. Notez que sous Windows, ctime est l’heure de création.
Obtenir la date et l’heure de création
Comme mentionné ci-dessus, la méthode d’obtention de l’heure de création varie en fonction du système d’exploitation.
- Windows : ctime
- Certains Unix tels que macOS : date de naissance
- Autre Unix : l’heure de création ne peut pas être récupérée
Approche multiplateforme
Si votre programme est uniquement pour Windows ou macOS, vous pouvez utiliser st_ctime ou st_birthtime, mais si vous souhaitez prendre en charge plusieurs plates-formes, vous devez définir une fonction.
Citez l’exemple de code répertorié dans la question et la réponse suivantes sur Stack Overflow.
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
Tout d’abord, il vérifie si le système est Windows ou non avec platform.system(), puis il utilise la gestion des exceptions pour basculer l’opération selon que l’attribut st_birthtime existe ou non.
Consultez l’article suivant pour plus d’informations sur platform.system() et la gestion des exceptions.
L’argument peut être une chaîne de chemin ou un objet pathlib.Path (Python 3.6 ou version ultérieure).
print(creation_date(p))
# 1549094605.9650702
print(datetime.datetime.fromtimestamp(creation_date(p)))
# 2019-02-02 17:03:25.965070
Notez que la fonction dans cet exemple de code renvoie st_mtime, qui indique l’heure de modification, si st_birthtime n’existe pas. Dans certains cas, il peut être préférable de renvoyer None pour indiquer clairement que l’heure de création ne peut pas être récupérée.
