Question Comment obtenir la date et l'heure de création et de modification du fichier en Python?


J'ai un script qui doit faire quelque chose en fonction des dates de création et de modification des fichiers mais qui doit fonctionner sous Linux et Windows.

Quel est le meilleur multiplateforme façon d'obtenir la création de fichiers et la date / heure de modification en Python?


686
2017-10-25 21:54


origine


Réponses:


Obtenir une sorte de date de modification de manière multi-plateforme est facile - il suffit d'appeler os.path.getmtime(chemin) et vous obtiendrez l'horodatage Unix de quand le fichier à path a été modifié pour la dernière fois.

Obtenir un fichier création D'un autre côté, les dates sont fastidieuses et dépendantes de la plate-forme, différant même entre les trois gros systèmes d'exploitation:

Mettre tout cela ensemble, le code multiplateforme devrait ressembler à quelque chose comme ça ...

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

316
2017-09-14 23:51



Vous avez deux choix. Pour un, vous pouvez utiliser le os.path.getmtime et os.path.getctime les fonctions:

import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))

Votre autre option est d'utiliser 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))

Remarque: ctime() Est-ce que ne pas se référer à l'heure de création sur les systèmes * nix, mais plutôt la dernière fois que les données de l'inode ont changé. (merci à kojiro d'avoir rendu ce fait plus clair dans les commentaires en fournissant un lien vers un article de blog intéressant)


611
2017-10-25 22:00



La meilleure fonction à utiliser pour cela est os.path.getmtime (). En interne, cela utilise juste os.stat(filename).st_mtime.

Le module datetime est le meilleur horodateur de manipulation, vous pouvez donc obtenir la date de modification en tant que datetime objet comme ceci:

import os
import datetime
def modification_date(filename):
    t = os.path.getmtime(filename)
    return datetime.datetime.fromtimestamp(t)

Exemple d'utilisation:

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

340
2017-10-06 14:51



os.stat https://docs.python.org/2/library/stat.html#module-stat

edit: Dans un code plus récent, vous devriez probablement utiliser os.path.getmtime () (merci Christian Oudard)
 mais notez qu'il renvoie une valeur en virgule flottante de time_t avec fraction secondes (si votre OS le supporte)


46
2017-10-25 21:58



Il y a deux méthodes pour obtenir le temps de mod, os.path.getmtime () ou os.stat (), mais le ctime n'est pas multi-plateforme fiable (voir ci-dessous).

os.path.getmtime ()

getmtime(chemin)
Renvoie l'heure de la dernière modification du chemin. La valeur de retour est un nombre donnant le nombre de secondes depuis l'époque (voir le module de temps). Soulever os.error si le fichier ne n'existe pas ou est inaccessible. Nouveau dans la version 1.5.2. Modifié dans la version 2.3: Si os.stat_float_times () renvoie True, le résultat est un nombre à virgule flottante.

os.stat ()

stat(chemin)
Effectuez un appel système stat () sur le chemin donné. La valeur de retour est un objet dont les attributs correspondent aux membres de la structure statistique, à savoir: st_mode (protection bits), st_ino (numéro d'inode), st_dev (périphérique), st_nlink (nombre de liens durs), st_uid (ID utilisateur du propriétaire), st_gid (ID groupe du propriétaire), st_size (taille du fichier, en octets), st_atime (heure de l'accès le plus récent), st_mtime (heure du contenu le plus récent modification), st_ctime (dépendant de la plateforme, heure de la dernière modification des métadonnées sous Unix ou heure de création sous Windows):

>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>> 

Dans l'exemple ci-dessus, vous utiliseriez statinfo.st_mtime ou statinfo.st_ctime pour obtenir respectivement mtime et ctime.


35
2017-10-25 22:05



os.stat retourne un tuple nommé avec st_mtime et st_ctime les attributs. L'heure de modification est st_mtime sur les deux plates-formes; malheureusement, sur Windows, ctime signifie "temps de création", tandis que POSIX signifie "changer le temps". Je ne connais aucun moyen d'obtenir le temps de création sur les plateformes POSIX.


11
2017-10-25 22:06



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

2
2017-10-25 22:07



Si le suivi des liens symboliques n'est pas important, vous pouvez également utiliser os.lstat intégré

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

1
2018-02-11 00:13



os.stat inclut le temps de création. Il n'y a pas de définition de st_anything pour l'élément de os.stat() qui contient l'heure.

Alors essayez ceci:

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

Comparez cela avec votre date de création sur le fichier en ls -lah

Ils devraient être les mêmes.


0
2017-12-14 23:39