Skip to content

Ermitteln von Datei-Zeitstempeln (Erstellungs-, Änderungs- und Zugriffsdatum und -zeit) in Python

Python

In Python können Sie die Standardbibliotheksmodule os und pathlib verwenden, um Zeitstempel wie Erstellung, Änderung und Zugriffsdatum und -uhrzeit von Dateien abzurufen. Es kann in Unix-Zeit (Epoch-Zeit, Posix-Zeit) erhalten werden, kann aber mit dem datetime-Modul in Datum und Zeit konvertiert werden.

Sie können die folgenden Zeitstempel erhalten. Die Bedeutung ist je nach Betriebssystem unterschiedlich, achten Sie auch besonders auf die Erstellungszeit.

  • atime: Zugriffszeit
  • mtime: Änderungszeit
  • ctime: Änderungszeit (Unix) und Erstellungszeit (Windows)
  • Geburtszeit: Erstellungszeit (einige Unix in der FreeBSD-Familie, einschließlich macOS)

Dieser Artikel hat folgenden Inhalt.

  • Rufen Sie os.stat_result mit Zeitstempelinformationen ab
    • Pfad.stat()
    • os.stat()
    • Attribut von os.stat_result
  • Holen Sie sich Zeitstempel mit der Funktion os.path
  • Konvertieren Sie den Zeitstempel in datetime
  • Art des Zeitstempels: atime, ctime, mtime, birthdaytime
  • Holen Sie sich das Datum und die Uhrzeit der Änderung
  • Rufen Sie das Erstellungsdatum und die Uhrzeit ab

Erstellen Sie beispielsweise eine Datei und aktualisieren Sie sie nach 10 Sekunden.

import os
import pathlib
import datetime
import time
import platform

p = pathlib.Path('data/temp/test.txt')

p.write_text('test')

time.sleep(10)

p.write_text('update')

Rufen Sie os.stat_result mit Zeitstempelinformationen ab

Sie können Dateimetadaten wie Zeitstempel als Attribute des Objekts os.stat_result abrufen.

Pfad.stat()

Sie können das Objekt os.stat_result mit der Methode stat() des Objekts pathlib.Path abrufen.

print(p.stat())
# os.stat_result(st_mode=33188, st_ino=8728494137, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=6, st_atime=1549094615, st_mtime=1549094615, st_ctime=1549094615)

print(type(p.stat()))
# <class 'os.stat_result'>

os.stat()

Sie können auch die Funktion os.stat() des Moduls os verwenden, um das Objekt os.stat_result abzurufen. Das Argument kann eine Pfadzeichenfolge oder ein pathlib.Path-Objekt (Python 3.6 oder höher) sein.

print(os.stat('data/temp/test.txt'))
# os.stat_result(st_mode=33188, st_ino=8728494137, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=6, st_atime=1549094615, st_mtime=1549094615, st_ctime=1549094615)

print(type(os.stat('data/temp/test.txt')))
# <class 'os.stat_result'>

print(os.stat(p))
# os.stat_result(st_mode=33188, st_ino=8728494137, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=6, st_atime=1549094615, st_mtime=1549094615, st_ctime=1549094615)

print(type(os.stat(p)))
# <class 'os.stat_result'>

Alle Methoden geben Ihnen dasselbe os.stat_result-Objekt.

print(p.stat() == os.stat('data/temp/test.txt') == os.stat(p))
# True

Attribut von os.stat_result

Sie können Zeitstempel mit den Attributen st_atime, st_mtime und st_ctime des Objekts os.stat_result erhalten. Auf einigen Unix-Systemen der FreeBSD-Familie, einschließlich macOS, gibt es auch ein Attribut st_birthtime. Die Bedeutung von jedem wird später beschrieben.

st = p.stat()

print(st.st_atime)
# 1549094615.972488

print(st.st_mtime)
# 1549094615.9723485

print(st.st_ctime)
# 1549094615.9723485

print(st.st_birthtime)
# 1549094605.9650702

Alle Attribute sind Fließkommazahlen und mindestens die Unix-Zeit (Epoch-Zeit, Posix-Zeit). Wie Sie diesen Wert in datetime umwandeln, wird später beschrieben.

print(type(st.st_ctime))
# <class 'float'>

Es gibt auch st_atime_ns, st_ctime_ns und st_mtime_ns, die den Wert einer ganzen Zahl int in Nanosekunden speichern. Es gibt kein entsprechendes Attribut für st_birthtime.

print(st.st_ctime_ns)
# 1549094615972348510

print(type(st.st_ctime_ns))
# <class 'int'>

Sie, dass, wie in der offiziellen Dokumentation gezeigt, Gleitkommazahl Float Informationen nach dem Dezimalkomma enthält und xxx_ns Werte in Nanosekunden speichert, aber die Genauigkeit nicht garantiert wird.

Die genaue Bedeutung und Auflösung der Attribute st_atime, st_mtime und st_ctime hängen vom Betriebssystem und dem Dateisystem ab. Beispielsweise hat st_mtime auf Windows-Systemen mit den Dateisystemen FAT oder FAT32 eine Auflösung von 2 Sekunden und st_atime nur eine Auflösung von 1 Tag. Nichts finden Sie in der Dokumentation Ihres Betriebssystems.
os – Verschiedene Betriebssystemschnittstellen – Dokumentation zu Python 3.10.0

os.stat_result hat verschiedene andere Attribute, wie z. B. st_size, das die Größe der Datei in Byte angibt. Lesen Sie den following Artikel zum Abrufen der Größe von Dateien und Ordnern.

Holen Sie sich Zeitstempel mit der Funktion os.path

Sie können Zeitstempel auch mit der Funktion os.path, getatime(), getmtime() und getctime() erhalten.

print(os.path.getatime('data/temp/test.txt'))
# 1549094615.972488

print(os.path.getmtime('data/temp/test.txt'))
# 1549094615.9723485

print(os.path.getctime('data/temp/test.txt'))
# 1549094615.9723485

In Python 3.6 oder höher can SIE statt einer Pfadzeichenfolge auch das pathlib.Path-Objekt als Argument angeben.

print(os.path.getctime(p))
# 1549094615.9723485

Wie SIE im Quellcode sehen können, erhalten diese Funktionen nur sterben entsprechende Attribute von os.stat_result.

def getmtime(filename):
    """Return the last modification time of a file, reported by os.stat()."""
    return os.stat(filename).st_mtime


def getatime(filename):
    """Return the last access time of a file, reported by os.stat()."""
    return os.stat(filename).st_atime


def getctime(filename):
    """Return the metadata change time of a file, reported by os.stat()."""
    return os.stat(filename).st_ctime

Natürlich can SIE mit Path.stat() oder os.stat() genau betrachtet Wert erhalten, als würden SIE os.stat_result erhalten und sein Attribut angeben.

print(os.path.getctime(p) == p.stat().st_ctime)
# True

Funktionen zum Abrufen von st_atime_ns, st_ctime_ns, st_mtime_ns und st_birthtime werden nicht bereitgestellt.

Konvertieren Sie den Zeitstempel in datetime

Wie im vorherigen Beispielcode wird der Zeitstempel in Unix-Zeit (Epoch-Zeit, Posix-Zeit) wiedergegeben.

Verwenden Sie zum Konvertieren in einem datetime-Objekt die Funktion datetime.fromtimestamp() des datetime-Moduls.

dt = datetime.datetime.fromtimestamp(p.stat().st_ctime)

print(dt)
# 2019-02-02 17:03:35.972348

print(type(dt))
# <class 'datetime.datetime'>

Weitere Informationen, einschließlich der Angabe der Zeitzone bei der Konvertierung, finden Sie im following Artikel.

Das datetime-Objekt kann in einen String in einem beliebigen Format oder ISO-Format konvertiert werden.

print(dt.strftime('%Y年%m月%d日 %H:%M:%S'))
# 2019年02月02日 17:03:35

print(dt.isoformat())
# 2019-02-02T17:03:35.972348

Art des Zeitstempels: atime, ctime, mtime, birthdaytime

Wie in der Einleitung erwähnt, gibt es verschiedene Arten von Zeitstempeln: atime, ctime, mtime und borntime.

  • atime: Zugriffszeit
  • mtime: Änderungszeit
  • ctime: Änderungszeit (Unix) und Erstellungszeit (Windows)
  • Geburtszeit: Erstellungszeit (einige Unix in der FreeBSD-Familie, einschließlich macOS)

Nichts finden Sie auf der folgenden Seite.

Holen Sie sich das Datum und die Uhrzeit der Änderung

Für die sogenannte Änderungszeit erhalten Sie mtime unabhängig vom Betriebssystem.

Verwenden Sie das Attribut st_mtime von os.stat_result oder die Funktion os.path.getmtime() wie im bisherigen Beispielcode.

print(os.path.getmtime('data/temp/test.txt'))
# 1549094615.9723485

print(p.stat().st_mtime)
# 1549094615.9723485

Verwenden Sie zum Konvertieren in einem datetime-Objekt die Funktion datetime.fromtimestamp() des datetime-Moduls.

print(datetime.datetime.fromtimestamp(p.stat().st_mtime))
# 2019-02-02 17:03:35.972348

Unter Unix können Sie ctime verwenden, um die Zeit der letzten Änderung von Metadaten abzurufen. Wenn Sie auch beispielsweise Dateinamensänderungen erkennen möchten, verwenden Sie ctime anstelle von mtime. Beachten Sie, dass ctime unter Windows die Erstellungszeit ist.

Rufen Sie das Erstellungsdatum und die Uhrzeit ab

Wie oben erwähnt, variiert die Methode zum Abrufen der Erstellungszeit je nach Betriebssystem.

  • Windows: ctime
  • Einige Unix wie macOS: Geburtszeit
  • Anderes Unix: Die Erstellungszeit kann nicht abgerufen werden

Plattformübergreifender Ansatz

Wenn Ihr Programm nur für Windows oder macOS ist, können Sie st_ctime oder st_birthtime verwenden, aber wenn Sie mehrere Plattformen unterstützen möchten, sollten Sie eine Funktion definieren.

Zitieren Sie den Beispielcode, der in der folgenden Frage aufgeführt ist, und antworten Sie auf Stack Overflow.

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

Zuerst prüft es mit platform.system(), ob es sich bei dem System um Windows handelt oder nicht, und used dann die Ausnahmebehandlung, um die Operation umzuschalten, je nachdem, ob das Attribut st_birthtime vorhanden ist oder nicht.

Weitere Informationen zu platform.system() und Ausnahmebehandlung finden Sie im following Artikel.

Das Argument kann eine Pfadzeichenfolge oder ein pathlib.Path-Objekt (Python 3.6 oder höher) sein.

print(creation_date(p))
# 1549094605.9650702

print(datetime.datetime.fromtimestamp(creation_date(p)))
# 2019-02-02 17:03:25.965070

Beachten Sie, dass die Funktion in diesem Beispielcode st_mtime zurückgibt, was die Änderungszeit angibt, wenn st_birthtime nicht vorhanden ist. In einigen Fällen kann es besser sein, None zurückzugeben, um deutlich zu machen, dass die Erstellungszeit nicht abgerufen werden kann.