J'ai un script qui doit faire certaines choses en fonction des dates de création et de modification de fichiers mais doit fonctionner sous Linux et Windows .
Quelle est la meilleure façon multiplateforme d'obtenir la création et la modification de fichiers date/times
en Python ?
Réponses:
Obtenir une sorte de date de modification de manière multiplateforme est facile - il suffit d'appeler et vous obtiendrez l'horodatage Unix de la dernière modification du fichier .
os.path.getmtime(path)
path
D'un autre côté, l' obtention des dates de création de fichiers dépend de la complexité et de la plate-forme, même entre les trois gros systèmes d'exploitation:
ctime
(documenté à https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) stocke sa date de création. Vous pouvez y accéder en Python viaos.path.getctime()
ou l'.st_ctime
attribut du résultat d'un appel àos.stat()
. Cela ne fonctionnera pas sous Unix, oùctime
c'est la dernière fois que les attributs ou le contenu du fichier ont été modifiés ..st_birthtime
attribut du résultat d'un appel àos.stat()
.Sous 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 des dates de création (par exemple, les
ext4
stockent dansst_crtime
), le noyau Linux n'offre aucun moyen d'y accéder ; en particulier, les structures renvoyées par lesstat()
appels en C, à partir de la dernière version du noyau, ne contiennent aucun champ de date de création . Vous pouvez également voir que l'identifiantst_crtime
ne figure actuellement nulle part dans la source Python . Au moins si vous êtes activéext4
, les données sont attachées 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 aux fichiers
mtime
, via l'unos.path.getmtime()
ou l' autre ou l'.st_mtime
attribut d'unos.stat()
résultat. Cela vous donnera la dernière fois que le contenu du fichier a été modifié, ce qui peut être suffisant pour certains cas d'utilisation.En mettant tout cela ensemble, le code multiplateforme devrait ressembler à ceci ...
la source
ext4
disques sous Linux, et j'aimerais savoir ce qui se passe lorsque Linux lit des fichiers écrits par Windows, ou vice versa, étant donné qu'ils utilisentst_ctime
différemment."w"
, il ne le remplace pas, il ouvre simplement le fichier existant et le tronque. Même si le contenu du fichier n'a aucun rapport avec ce qu'il avait lors de sa création, on vous dirait tout de même que le fichier a été "créé" bien avant la version actuelle. Inversement, les éditeurs qui utilisent le remplacement atomique lors de l'enregistrement (le fichier d'origine est remplacé par un nouveau fichier temporaire en cours de travail) afficheraient une date de création plus récente, même si vous venez de supprimer un caractère. Utilisez l'heure de modification, ne cherchez pas l'heure de création.stat.st_ctime
est plus pertinent car, dans de nombreux cas, l'heure du dernier changement de métadonnées peut être l'heure de création (au moinsctime
plus proche de l' heure de création réelle quemtime
). Par conséquent, vous pouvez simplement remplacer votre extrait parstat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime
. Qu'est-ce que tu penses? Vivectime
doivent toujours être égales ou supérieures àmtime
, car unemtime
modification entraîne unectime
modification (carmtime
elle-même est considérée comme des "métadonnées"). Voir stackoverflow.com/a/39521489/1709587 où je fournis un exemple de code pour illustrer cela.Vous avez deux choix. D'une part, vous pouvez utiliser les fonctions
os.path.getmtime
etos.path.getctime
:Votre autre option consiste à utiliser
os.stat
:Remarque :
ctime()
ne fait pas référence à l'heure de création sur les systèmes * nix, mais plutôt à la dernière modification des données d'inode. (merci à kojiro d'avoir clarifié ce fait dans les commentaires en fournissant un lien vers un article de blog intéressant)la source
ctime
est mis à jour chaque fois que lemtime
fait (depuismtime
est « métadonnées »), et donc lectime
est normalement toujours égal à ou avant lamtime
. Traiterctime
comme du temps "créé" n'a donc aucun sens. -1!Last modified: Fri Jan 31 11:08:13 2020
etCreated: Fri Jan 31 11:08:13 2020
sur Linux Ubuntu 16.04!time.ctime(os.path.getmtime(file))
renvoie 2 types de chaînes, selon que le fichier a été modifié par le système ou par l'utilisateur. Si elle a été modifiée par le système, la chaîne aura 2 espaces entre le mois et le jour. Je ne sais pas pourquoiLa 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 des horodatages de manipulation, vous pouvez donc obtenir la date de modification sous la forme d'un
datetime
objet comme celui-ci:Exemple d'utilisation:
la source
getmtime
est la chose la plus proche disponible sur Unix (où obtenir des dates de création n'est pas possible), mais ce n'est certainement pas la meilleure fonction à utiliser sur Windows, où lectime
est un temps de création.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 à virgule flottante de time_t avec des secondes de fraction (si votre système d'exploitation le prend en charge)
la source
os.path.getmtime()
existe depuis Python 1.5.2 (voir les anciens documents ), publié avant que j'aie perdu la plupart de mes dents de lait et près d'une décennie avant que vous n'écriviez la version originale de cette réponse.Il existe deux méthodes pour obtenir l'heure du mod, os.path.getmtime () ou os.stat (), mais le ctime n'est pas fiable multiplateforme (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 écoulées depuis l'époque (voir le module de temps). Relancez 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 ( path )
Effectue 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 (bits de protection), 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 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 plateforme; heure de la dernière modification des métadonnées) sous Unix, ou l'heure de création sous Windows) :
Dans l'exemple ci-dessus, vous utiliseriez statinfo.st_mtime ou statinfo.st_ctime pour obtenir respectivement mtime et ctime.
la source
Dans Python 3.4 et supérieur, vous pouvez utiliser l' interface du module pathlib orienté objet qui inclut des wrappers pour une grande partie du module os. Voici un exemple d'obtention des statistiques du fichier.
Pour plus d'informations sur ce qui
os.stat_result
contient, reportez-vous à la documentation . Pour l'heure de modification que vous souhaitezfname.stat().st_mtime
:Si vous voulez l'heure de création sur Windows, ou la modification de métadonnées la plus récente sur Unix, vous utiliseriez
fname.stat().st_ctime
:Cet article contient des informations et des exemples plus utiles pour le module pathlib.
la source
os.stat
renvoie un tuple nommé avec des attributsst_mtime
etst_ctime
. L'heure de modification estst_mtime
sur les deux plates-formes; malheureusement, sous Windows,ctime
signifie «heure de création», tandis que sur POSIX, cela signifie «changer l'heure». Je ne connais aucun moyen d'obtenir l'heure de création sur les plates-formes POSIX.la source
dir(..)
en un. Par exempledir(os.stat(os.listdir('.')[0]))
impressions
la source
la source
Si les liens symboliques suivants ne sont pas importants, vous pouvez également utiliser la fonction
os.lstat
intégrée.la source
Il peut être utile de jeter un œil à la
crtime
bibliothèque qui implémente l'accès multiplateforme au moment de la création du fichier.la source
debugfs
sous Linux qui est par définition instable, nécessite un accès root de haut niveau pour tout et à peu près tous les aspects ont tendance à être l'une des choses dont votre mère vous a toujours prévenu. (Mais oui, cela fonctionne probablement si vous êtes vraiment désespéré et que vous êtes le vrai superutilisateur sur un système sans démarrage sécurisé…)os.stat
ne comprend pas le temps de création. Il n'y a tout simplement pas de définition de st_anything pour l'élémentos.stat()
qui contient le temps.Essayez donc 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.
la source
J'ai pu obtenir du temps de création sur posix en exécutant la commande stat du système et en analysant la sortie.
L'exécution de stat en dehors de python à partir du terminal (OS X) a renvoyé:
... où le quatrième datetime est la création du fichier (plutôt que le temps de changement ctime comme d'autres commentaires l'ont noté).
la source