Comment obtenir la date/l'Heure de création et de modification des fichiers en Python?

j'ai un script qui a besoin de faire des choses basées sur la création de fichiers et les dates de modification, mais qui doit fonctionner sous Linux et Windows.

Quel est le meilleur cross-plateforme de façon à obtenir un fichier de création et de modification de la date/de temps en Python?

713
demandé sur Mark Biek 2008-10-26 01:54:56

10 réponses

obtenir une date de modification d'une manière multiplateforme est facile-il suffit d'appeler os.path.getmtime(path) et vous obtiendrez L'horodatage Unix de quand le fichier path a été modifié pour la dernière fois.

Obtention fichier création dates, d'autre part, est délicat et dépend de la plateforme, des différences même entre les trois grands Systèmes d'exploitation:

en regroupant tout cela, le code multiplate-forme 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
350
répondu Mark Amery 2018-02-19 13:44:53

vous avez le choix. Pour un, vous pouvez utiliser les os.path.getmtime et os.path.getctime 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))

Note : ctime() ne pas référence à la création de temps sur les systèmes *nix, mais plutôt la dernière fois que l'inode de la modification des données. (merci à kojiro pour faire plus clair dans les commentaires en fournissant un lien vers un blog intéressant post)

617
répondu Bryan Oakley 2017-08-06 21:40:46

La meilleure fonction à utiliser pour cela est os.chemin.getmtime () . Sur le plan interne, cela utilise juste os.stat(filename).st_mtime .

le module datetime est celui qui manipule le mieux les horodateurs, vous pouvez donc obtenir la date de modification comme un 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)
345
répondu Christian Oudard 2009-10-06 14:56:39

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

edit: dans le code plus récent vous devriez probablement utiliser os.chemin.getmtime () (merci Christian Oudard)

mais notez qu'il renvoie une valeur à virgule flottante de time_t avec fraction de secondes (si votre OS le supporte)

46
répondu Martin Beckett 2017-12-20 17:23:32

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

os.chemin.getmtime ()

getmtime ( path )

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

os.stat ()

stat ( chemin )

effectuer 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 stat, à savoir: st_mode (protection bits), st_ino (numéro d'inœud), st_dev (périphérique), st_nlink (nombre de liens en dur), st_uid (ID d'utilisateur du propriétaire), st_gid (ID de groupe de 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 plate-forme; l'heure du changement de métadonnées le plus récent sur Unix, ou l'Heure de création sur 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 utilisez statinfo.st_mtime ou statinfo.st_ctime pour obtenir le mtime et ctime, respectivement.

36
répondu Jay 2008-10-25 22:05:20

os.stat renvoie un tuple nommé avec les attributs st_mtime et st_ctime . Le temps de modification est st_mtime sur les deux plateformes; malheureusement, sur Windows, ctime signifie "Temps de création", alors que sur POSIX il signifie "Temps de changement". Je ne suis au courant d'aucun moyen d'obtenir le temps de création sur les plateformes POSIX.

11
répondu mithrandi 2016-05-31 12:55:24
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 
2
répondu unmounted 2008-10-25 22:07:44

Si suivre les liens symboliques n'est pas important, vous pouvez également utiliser le os.lstat builtin.

>>> 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
répondu Low Kian Seong 2015-02-11 00:13:15

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

alors essayez ceci:

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

comparez cela avec votre date de création dans le fichier ls-lah

Ils devraient être les mêmes.

0
répondu Rod 2011-03-10 14:55:38

j'ai pu obtenir le temps de création sur posix en exécutant la commande stat du système et en analysant la sortie.

commands.getoutput('stat FILENAME').split('\"')[7]

Exécution de stat en dehors de python à partir de la Borne (OS X) retourné:

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

... où la quatrième datetime est la création du fichier (plutôt que ctime change time comme d'autres commentaires notés).

-3
répondu kmarchand 2013-08-29 20:54:51