web-dev-qa-db-fra.com

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

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

Quel est le meilleur multiplate-forme moyen d'obtenir la date et l'heure de création et de modification de fichier en Python?

828
Mark Biek

Obtenir une sorte de date de modification sur plusieurs plates-formes est facile - il suffit d'appeler os.path.getmtime(path) et vous obtiendrez l'horodatage Unix de la dernière modification du fichier sur path.

Obtenir des dates de création de fichier est quant à lui extrêmement complexe et dépendant de la plate-forme. Il diffère même entre les trois grands systèmes d'exploitation:

En résumé, le code multiplateforme devrait ressembler à ceci ...

_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
_
490
Mark Amery

Vous avez deux choix. D'une part, vous pouvez utiliser les fonctions os.path.getmtime et os.path.getctime :

_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() ne ne fait pas référence à l'heure de création sur les systèmes * nix, mais plutôt la dernière fois que les données d'inode ont été modifiées. (merci à kojiro d'avoir précisé ce fait dans les commentaires en fournissant un lien vers un article de blog intéressant)

646
Bryan Oakley

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

Le module datetime est le meilleur timestamping, vous pouvez donc obtenir la date de modification sous la forme d'un objet datetime 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)
364
Christian Oudard

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

edit: Dans le code le plus récent, vous devriez probablement utiliser os.path.getmtime () (merci Christian Oudard)
mais notez qu'il renvoie une valeur à virgule flottante de time_t avec une fraction de seconde (si votre système d'exploitation le prend en charge).

45
Martin Beckett

Il existe deux méthodes pour obtenir l'heure de modification, os.path.getmtime () ou os.stat (), mais ctime n'est pas fiable entre plates-formes (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 indiquant le nombre de secondes depuis l'époque (voir le module Heure). Raise os.error si le fichier 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 )
Effectue un appel système stat () sur le chemin indiqué. La valeur de retour est un objet dont les attributs correspondent aux membres de la structure stat, à savoir: st_mode (bits de protection), st_ino (numéro d'inode), st_dev (périphérique), st_nlink (nombre de liens physiques), st_uid (ID utilisateur du propriétaire). ), st_gid (ID de 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 de la dernière modification de contenu), st_ctime (en fonction de la plate-forme; heure du dernier changement de métadonnées sur Unix ou 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 utiliseriez statinfo.st_mtime ou statinfo.st_ctime pour obtenir respectivement mtime et ctime.

37
Jay

os.stat renvoie un tuple nommé avec les attributs st_mtime et st_ctime. L'heure de modification est st_mtime sur les deux plates-formes; Malheureusement, sous Windows, ctime signifie "heure de création", alors que sous POSIX, cela signifie "heure de changement". Je ne connais aucun moyen d'obtenir l'heure de création sur les plateformes POSIX.

11
mithrandi

Dans Python 3.4 et versions ultérieures, vous pouvez utiliser l'interface module pathlib orientée objet qui inclut des wrappers pour la plupart du module os. Voici un exemple d'obtention des statistiques de fichier.

>>> import pathlib
>>> fname = pathlib.Path('test.py')
>>> assert fname.exists(), f'No such file: {fname}'  # check that the file exists
>>> print(fname.stat())
os.stat_result(st_mode=33206, st_ino=5066549581564298, st_dev=573948050, st_nlink=1, st_uid=0, st_gid=0, st_size=413, st_atime=1523480272, st_mtime=1539787740, st_ctime=1523480272)

Pour plus d'informations sur ce que os.stat_result contient, reportez-vous à la documentation . Pour le temps de modification que vous souhaitez fname.stat().st_mtime:

>>> import datetime
>>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime)
>>> print(mtime)
datetime.datetime(2018, 10, 17, 10, 49, 0, 249980)

Si vous voulez l'heure de création sous Windows ou la dernière modification de métadonnées sous Unix, utilisez fname.stat().st_ctime:

>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)

Cet article a plus d’informations utiles et d’exemples pour le module pathlib.

7
Steven C. Howell
import os, time, datetime

file = "somefile.txt"
print(file)

print("Modified")
print(os.stat(file)[-2])
print(os.stat(file).st_mtime)
print(os.path.getmtime(file))

print()

print("Created")
print(os.stat(file)[-1])
print(os.stat(file).st_ctime)
print(os.path.getctime(file))

print()

modified = os.path.getmtime(file)
print("Date modified: "+time.ctime(modified))
print("Date modified:",datetime.datetime.fromtimestamp(modified))
year,month,day,hour,minute,second=time.localtime(modified)[:-3]
print("Date modified: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))

print()

created = os.path.getctime(file)
print("Date created: "+time.ctime(created))
print("Date created:",datetime.datetime.fromtimestamp(created))
year,month,day,hour,minute,second=time.localtime(created)[:-3]
print("Date created: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))

empreintes

somefile.txt
Modified
1429613446
1429613446.0
1429613446.0

Created
1517491049
1517491049.28306
1517491049.28306

Date modified: Tue Apr 21 11:50:46 2015
Date modified: 2015-04-21 11:50:46
Date modified: 21/04/2015 11:50:46

Date created: Thu Feb  1 13:17:29 2018
Date created: 2018-02-01 13:17:29.283060
Date created: 01/02/2018 13:17:29
5
Puddle
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 
3
unmounted

Si le fait de suivre des liens symboliques n’est pas important, vous pouvez également utiliser le fichier intégré os.lstat.

>>> 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
Low Kian Seong

Cela vaut la peine de jeter un coup d'œil à la bibliothèque crtime qui implémente un accès multiplate-forme au moment de la création du fichier.

from crtime import get_crtimes_in_dir

for fname, date in get_crtimes_in_dir(".", raise_on_error=True, as_Epoch=False):
    print(fname, date)
    # file_a.py Mon Mar 18 20:51:18 CET 2019
0
Delgan

os.stat inclut l'heure 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 dans ls -lah

Ils devraient être les mêmes.

0
pat Callahan