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?
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:
ctime
(documenté à l'emplacement https://msdn.Microsoft.com/en-us/library /14h5k7ff.aspx ) enregistre sa date de création. Vous pouvez y accéder de Python à os.path.getctime()
ou à l'attribut .st_ctime
du résultat d'un appel à os.stat()
=. Ceci ne fonctionnera pas sous Unix, où la ctime
est la dernière fois que les attributs du fichier ou le contenu a été changé ..st_birthtime
du résultat d'un appel à os.stat()
.Sur Linux , cela est actuellement impossible, du moins sans écrire une extension C pour Python. Bien que certains systèmes de fichiers couramment utilisés avec Linux stockent les dates de création (par exemple, _ext4
_ les stocke dans _st_crtime
_), le noyau Linux ne permet pas d'accéder à eux ; en particulier, les structures renvoyées par les appels stat()
en C, à partir de la dernière version du noyau, ne contient aucun champ de date de création . Vous pouvez également constater que l'identifiant _st_crtime
_ ne figure actuellement nulle part ailleurs dans source Python . Du moins si vous êtes sur _ext4
_, les données sont attachées aux inodes du système de fichiers, mais il n’existe aucun moyen pratique d’y accéder.
La meilleure chose sous Linux consiste à accéder à la variable mtime
du fichier, soit à l'aide de os.path.getmtime()
ou de l'attribut .st_mtime
d'un résultat os.stat()
. Cela vous donnera la dernière fois que le contenu du fichier a été modifié, ce qui peut convenir à certains cas d'utilisation.
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
_
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)
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)
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).
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).
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.
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.
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.
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.
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
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>>
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
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
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.