Ich habe ein Skript, das einige Dinge basierend auf den Erstellungs- und Änderungsdaten von Dateien ausführen muss, aber unter Linux und Windows ausgeführt werden muss .
Was ist der beste plattformübergreifende Weg, um Dateien date/times
in Python zu erstellen und zu ändern ?
Antworten:
Es ist einfach, plattformübergreifend ein Änderungsdatum zu erhalten. Rufen Sie einfach an und Sie erhalten den Unix-Zeitstempel, wann die Datei zuletzt geändert wurde.
os.path.getmtime(path)
path
Erste Datei Erstellung Daten, auf der anderen Seite, ist knifflig und plattformabhängig und unterscheiden sich auch zwischen den drei großen OSes:
ctime
(dokumentiert unter https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) das Erstellungsdatum. Sie können in Python überos.path.getctime()
oder über das.st_ctime
Attribut des Ergebnisses eines Aufrufs auf darauf zugreifenos.stat()
. Dies wird nicht auf Unix arbeiten, wo dasctime
ist das letzte Mal , dass die Attribute der Datei oder Inhalt verändert wurden ..st_birthtime
Attribut des Ergebnisses eines Aufrufs von verwendenos.stat()
.Unter Linux ist dies derzeit nicht möglich, zumindest ohne eine C-Erweiterung für Python zu schreiben. Obwohl einige unter Linux häufig verwendete Dateisysteme Erstellungsdaten speichern (z. B.
ext4
speichern inst_crtime
), bietet der Linux-Kernel keine Möglichkeit, auf sie zuzugreifen . Insbesondere enthalten die Strukturen, die vonstat()
Aufrufen in C ab der neuesten Kernelversion zurückgegeben werden, keine Felder für das Erstellungsdatum . Sie können auch sehen, dass der Bezeichnerst_crtime
derzeit nirgendwo in der Python-Quelle enthalten ist . Zumindest , wenn Sie aufext4
die Daten wird auf die Inodes im Dateisystem angebracht ist , aber es gibt keine bequeme Möglichkeit , es zuzugreifen.Das nächstbeste unter Linux ist der Zugriff auf die Dateien
mtime
entweder überos.path.getmtime()
oder über das.st_mtime
Attribut einesos.stat()
Ergebnisses. Auf diese Weise erhalten Sie das letzte Mal, dass der Inhalt der Datei geändert wurde, was für einige Anwendungsfälle ausreichend sein kann.Zusammen sollte plattformübergreifender Code ungefähr so aussehen ...
quelle
ext4
Laufwerken unter Linux entwickeln und erfahren, was passiert, wenn Linux von Windows geschriebene Dateien liest oder umgekehrt, da siest_ctime
unterschiedlich verwendet werden."w"
, wird sie nicht ersetzt, sondern nur die vorhandene Datei geöffnet und abgeschnitten. Auch wenn der Dateiinhalt in keinerlei Beziehung zu dem steht, was er bei der Erstellung hatte, wird Ihnen dennoch mitgeteilt, dass die Datei lange vor der aktuellen Version "erstellt" wurde. Umgekehrt würden Editoren, die beim Speichern atomares Ersetzen verwenden (die Originaldatei wird durch eine neue temporäre Datei ersetzt), ein neueres Erstellungsdatum anzeigen, selbst wenn Sie nur ein Zeichen gelöscht haben. Verwenden Sie die Änderungszeit, und suchen Sie nicht nach der Erstellungszeit.stat.st_ctime
relevanter, da in vielen Fällen der Zeitpunkt der letzten Metadatenänderung die Erstellungszeit sein kann (zumindestctime
näher an der tatsächlichen Erstellungszeit alsmtime
). Daher können Sie Ihr Snippet einfach durch ersetzenstat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime
. Was denken Sie? Cheersctime
sollte immer gleich oder später alsmtime
, weil einemtime
Änderung bewirkt einectime
Änderung (weil die fürmtime
sich betrachtet wird „Metadaten“). Siehe stackoverflow.com/a/39521489/1709587, wo ich einen Beispielcode zur Veranschaulichung bereitstelle.Sie haben ein paar Möglichkeiten. Zum einen können Sie die Funktionen
os.path.getmtime
undos.path.getctime
verwenden:Ihre andere Option ist
os.stat
:Hinweis :
ctime()
Bezieht sich nicht auf die Erstellungszeit auf * nix-Systemen, sondern auf das letzte Mal, als sich die Inode-Daten geändert haben. (Danke an kojiro, dass er diese Tatsache in den Kommentaren durch einen Link zu einem interessanten Blog-Beitrag klarer gemacht hat)quelle
ctime
dann aktualisiert wird, wenn dies dermtime
Fall ist (da diesmtime
"Metadaten" sind), und daherctime
ist der normalerweise immer gleich oder vor demmtime
. Die Behandlungctime
als „geschaffen“ Zeit also keinen Sinn macht. -1!Last modified: Fri Jan 31 11:08:13 2020
undCreated: Fri Jan 31 11:08:13 2020
unter Linux Ubuntu 16.04!time.ctime(os.path.getmtime(file))
zwei Arten von Zeichenfolgen zurückgegeben werden, je nachdem, ob die Datei vom System oder vom Benutzer geändert wurde. Wenn es vom System geändert wurde, hat die Zeichenfolge zwischen dem Monat und dem Tag zwei Leerzeichen. Ich weiß nicht warumDie beste Funktion hierfür ist os.path.getmtime () . Intern wird dies nur verwendet
os.stat(filename).st_mtime
.Das Datum / Uhrzeit-Modul ist die beste Zeitleiste zum Bearbeiten, sodass Sie das Änderungsdatum als
datetime
Objekt wie folgt abrufen können :Anwendungsbeispiel:
quelle
getmtime
ist die nächste unter Unix verfügbare Funktion (bei der das Abrufen von Erstellungsdaten nicht möglich ist), aber definitiv nicht die beste Funktion für Windows, bei derctime
es sich um eine Erstellungszeit handelt.os.stat https://docs.python.org/2/library/stat.html#module-stat
edit: In neuerem Code sollten Sie wahrscheinlich os.path.getmtime () verwenden (danke Christian Oudard),
aber beachten Sie, dass es einen Gleitkommawert von time_t mit Bruchteilen von Sekunden zurückgibt (wenn Ihr Betriebssystem dies unterstützt).
quelle
os.path.getmtime()
gibt es seit Python 1.5.2 (siehe die alten Dokumente ), das veröffentlicht wurde, bevor ich die meisten meiner Milchzähne verloren hatte und fast ein Jahrzehnt, bevor Sie die Originalversion dieser Antwort geschrieben haben.Es gibt zwei Methoden, um die Mod-Zeit abzurufen: os.path.getmtime () oder os.stat (), aber die ctime ist nicht zuverlässig plattformübergreifend (siehe unten).
os.path.getmtime ()
getmtime ( Pfad ) Gibt
die Zeit der letzten Änderung des Pfads zurück. Der Rückgabewert ist eine Zahl, die die Anzahl der Sekunden seit der Epoche angibt (siehe Zeitmodul). Erhöhen Sie os.error, wenn die Datei nicht vorhanden ist oder nicht zugänglich ist. Neu in Version 1.5.2. In Version 2.3 geändert: Wenn os.stat_float_times () True zurückgibt, ist das Ergebnis eine Gleitkommazahl.
os.stat ()
stat ( Pfad )
Führen Sie einen stat () - Systemaufruf für den angegebenen Pfad aus. Der Rückgabewert ist ein Objekt, dessen Attribute den Mitgliedern der stat-Struktur entsprechen, nämlich: st_mode (Schutzbits), st_ino (Inode-Nummer), st_dev (Gerät), st_nlink (Anzahl der festen Links), st_uid (Benutzer-ID des Eigentümers) ), st_gid (Gruppen-ID des Eigentümers), st_size (Dateigröße in Byte), st_atime (Zeitpunkt des letzten Zugriffs), st_mtime (Zeitpunkt der letzten Inhaltsänderung ), st_ctime (plattformabhängig; Zeitpunkt der letzten Metadatenänderung) unter Unix oder zum Zeitpunkt der Erstellung unter Windows) :
Im obigen Beispiel würden Sie statinfo.st_mtime oder statinfo.st_ctime verwenden, um die mtime bzw. ctime abzurufen.
quelle
In Python 3.4 und höher können Sie die objektorientierte Pathlib-Modulschnittstelle verwenden, die Wrapper für einen Großteil des OS-Moduls enthält. Hier ist ein Beispiel für das Abrufen der Dateistatistiken.
Weitere Informationen zu den Inhaltsstoffen
os.stat_result
finden Sie in der Dokumentation . Für die gewünschte Änderungszeitfname.stat().st_mtime
:Wenn Sie die Erstellungszeit unter Windows oder die letzte Änderung der Metadaten unter Unix wünschen, würden Sie Folgendes verwenden
fname.stat().st_ctime
:Dieser Artikel enthält weitere hilfreiche Informationen und Beispiele für das Pathlib-Modul.
quelle
os.stat
Gibt ein benanntes Tupel mitst_mtime
undst_ctime
Attributen zurück. Die Änderungszeit istst_mtime
auf beiden Plattformen; Leiderctime
bedeutet unter Windows "Erstellungszeit", während es unter POSIX "Änderungszeit" bedeutet. Mir ist keine Möglichkeit bekannt, die Erstellungszeit auf POSIX-Plattformen zu ermitteln.quelle
dir(..)
eines an. ZBdir(os.stat(os.listdir('.')[0]))
druckt
quelle
quelle
Wenn das
os.lstat
Befolgen symbolischer Links nicht wichtig ist, können Sie auch die integrierte Funktion verwenden.quelle
Es kann sich lohnen, einen Blick auf die
crtime
Bibliothek zu werfen, die den plattformübergreifenden Zugriff auf die Dateierstellungszeit implementiert.quelle
debugfs
unter Linux verwendet, das per Definition instabil ist, für alles Root-Zugriff auf oberster Ebene erfordert und in so ziemlich jedem Aspekt eines der Dinge ist, vor denen deine Mutter dich immer gewarnt hat. (Aber ja, es funktioniert wahrscheinlich, wenn Sie wirklich verzweifelt sind und zufällig der echte Superuser auf einem System ohne sicheren Start sind…)os.stat
enthält die Erstellungszeit. Es gibt einfach keine Definition von st_anything für das Elementos.stat()
, das die Zeit enthält.Versuchen Sie Folgendes:
os.stat('feedparser.py')[8]
Vergleichen Sie das mit Ihrem Erstellungsdatum in der Datei in ls-lah
Sie sollten gleich sein.
quelle
Ich konnte die Erstellungszeit für posix ermitteln, indem ich den Befehl stat des Systems ausführte und die Ausgabe analysierte.
Das Ausführen von stat außerhalb von Python vom Terminal (OS X) ergab Folgendes:
... wobei die vierte datetime die Dateierstellung ist (anstelle der ctime-Änderungszeit, wie in anderen Kommentaren angegeben).
quelle