Holen Sie sich Datei Änderung Zeit, um Nanosekunden Präzision

Ich muss die volle Nanosekunden-Präzision modifizierte Zeitstempel für jede Datei in einem Python 2-Programm, das den Dateisystem Baum geht zu bekommen. Ich möchte das in Python selbst machen, denn das Auftauchen eines neuen Unterprozesses für jede Datei wird langsam sein.

Von der C-Bibliothek auf Linux können Sie Nanosekunden-Präzisions-Zeitstempel erhalten, indem Sie das Feld st_mtime_nsec eines stat Ergebnisses betrachten. Beispielsweise:

 #include <sys/stat.h> #include <stdio.h> int main() { struct stat stat_result; if(!lstat("/", &stat_result)) { printf("mtime = %lu.%lu\n", stat_result.st_mtim.tv_sec, stat_result.st_mtim.tv_nsec); } else { printf("error\n"); return 1; } } 

mtime = 1380667414.213703287 ( / ist auf einem ext4 Dateisystem, das Nanosekunden-Zeitstempel unterstützt und die Uhr UTC ist).

Ähnlich, date --rfc-3339=ns --reference=/ prints 2013-10-01 22:43:34.213703287+00:00 .

Python (2.7.3) 's os.path.getmtime(filename) und os.lstat(filename).st_mtime geben die mtime als float . Das Ergebnis ist jedoch falsch:

 In [1]: import os In [2]: os.path.getmtime('/') % 1 Out[2]: 0.21370339393615723 In [3]: os.lstat('/').st_mtime % 1 Out[3]: 0.21370339393615723 

– nur die ersten 6 Ziffern sind richtig, vermutlich wegen Gleitkomma-Fehler.

3 Solutions collect form web for “Holen Sie sich Datei Änderung Zeit, um Nanosekunden Präzision”

Alternativ nutzt man auch die cffi- Bibliothek, die mit Python 2 mit dem folgenden Code arbeitet ( auf LInux getestet ):

 from __future__ import print_function from cffi import FFI ffi = FFI() ffi.cdef(""" typedef long long time_t; typedef struct timespec { time_t tv_sec; long tv_nsec; ...; }; typedef struct stat { struct timespec st_mtim; ...; }; int lstat(const char *path, struct stat *buf); """) C = ffi.verify() result = ffi.new("struct stat *") p = C.lstat("foo.txt", result) print("mtime = {0:d}.{1:09d}".format(result.st_mtim.tv_sec, result.st_mtim.tv_nsec)) 

Dies ist identisch in Verhalten zu Ihrem C-Programm in Ihrer Frage. Dies erzeugt die Ausgabe:

 $ ./test.py mtime = 1381711568.315075616 

Das hat die gleiche Präzision wie Ihr C-Programm:

 $ gcc test.c -o test $ ./test mtime = 1381711568.315075616 

os.stat('/').st_mtime ist ein float-Objekt, und die Präzision des os.stat('/').st_mtime ist zu niedrig für einen Zeitstempel mit Nanosekunde,

Python's Underlying-Typ für Floats ist ein IEEE 754 double, was nur gut für etwa 16 Dezimalstellen ist. Mit zehn Ziffern vor dem Dezimalpunkt, der sechs für Sub-Sekunde-Auflösungen verlässt, die drei von der Reichweite entfernt ist, die erforderlich ist, um POSIX-Nanosekunden-Zeitstempel zu bewahren. Über: Diese Woche in Python Dummheit: os.stat, os.utime und Sub-Second Zeitstempel

Wenn Sie Python 3 verwenden können, gibt es ein neues Attribut namens st_mtime_ns , das ist st_mtime in Nanosekunden. Versuch es.

 >>> os.stat('.').st_mtime 1381571932.044594 >>> os.stat('.').st_mtime_ns 1381571932044593972 

Referenzen:

PEP 410 – Verwenden Sie decimal.Decimal-Typ für Zeitstempel

Os.stat (): neue Felder hinzufügen, um Zeitstempel als Dezimalobjekte mit Nanosekundenauflösung zu erhalten

Füge f_ * time_ns-Felder zu os.stat () hinzu, füge ns-Schlüsselwort zu os hinzu. Utime (), os. Utimens () erwartet eine Anzahl von Nanosekunden

Ich würde das genauso sagen wie Glaslion – Python wandelt st_mtime in Gleitkomma um, was signifikante Ziffern verliert.

Eine Alternative ist es, das "ctypes" -Modul oder Cython zu verwenden, um direkt auf die C-Bibliothek zuzugreifen, die ein nettes unsigned long im Nanosekunden-Feld zurückgeben sollte (kann dir kein Beispiel geben, weil du keine Informationen gegeben hast Ihr Betriebssystem).

  • Python 2.7.5 Fehlerliste Liste der Float-Nummern
  • Wie man präzise Berechnungen in Python durchführt, unabhängig von Eingabetypen?
  • Python numpy float16 Datentyp Operationen und float8?
  • Gleitkomma-Präzision im Python-Array
  • Begrenzung von Schwimmern auf zwei Dezimalstellen
  • Falsche Antwort in SPOJ `CUBERT`
  • Was genau ist der "Auflösung" -Parameter von numpy float
  • Python ist die beste Programmiersprache der Welt.