Skip to content

Obtenir l’horodatage d’un fichier (création, modification, date et heure d’accès) en Python

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.