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?
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:
- Sur Windows , un dossier
ctime
(documenté à https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) conserve sa date de création. Vous pouvez y accéder en Python viaos.path.getctime()
ou l'attribut.st_ctime
du résultat d'un appel àos.stat()
. Ce ne fonctionnera pas sur Unix, où lectime
est la dernière fois que les attributs du fichier ou contenu ont été modifiés . - sur Mac , ainsi que d'autres OS Unix-basés, vous pouvez utiliser le
.st_birthtime
attribut du résultat d'un appel àos.stat()
. -
sur Linux , c'est actuellement impossible, du moins sans écrire une extension C pour Python. Bien que certains systèmes de fichiers couramment utilisés avec Linux date de création des magasins (par exemple,
ext4
les stocke dansst_crtime
), le noyau Linux n'offre aucun moyen d'y accéder ; en particulier, les structures qu'il renvoie des appelsstat()
en C, à partir de la dernière version du noyau, ne contiennent pas de champs Date de création . Vous pouvez également voir que l'identifiantst_crtime
ne figure actuellement nulle part dans le source Python . Au moins si vous êtes surext4
, les données est attaché aux inodes dans le système de fichiers, mais il n'y a aucun moyen pratique d'y accéder.la prochaine meilleure chose sur Linux est d'accéder au fichier
mtime
, soit paros.path.getmtime()
ou le.st_mtime
attribut d'un résultatos.stat()
. Cela vous donnera la dernière fois que le contenu du fichier a été modifié, qui peut être adéquat pour certaines utilisations.
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
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)
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)
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)
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.
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.
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>>
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
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.
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).