os.stat 2.4 bug auch in 2.6?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

Hallo,
ich prüfe unter Python 2.6 (linux 2.6.32-30-generic) mit:

Code: Alles auswählen

if os.stat(datei1).st_mtime > os.stat(datei2).st_mtime:
ob datei 1 jüngeren Datums ist (also z.B. datei 2 übeschreiben darf)
Obwohl beide Dateien lt. ls -l den gleichen Zeitstempel besitzen, liefert
obiges True. Unter Python 2.4 ist so was als bug bekannt. Ist das für 2.6
ebenso?

Gruß
joh
BlackJack

@joh#: ``ls -l`` zeigt in der Regel nicht die volle Auflösung des Zeitstempels. Wie sehen denn die `st_mtime`-Attribute aus?

Und das kann auch problematisch werden, wenn die Dateien auf verschiedenen Dateisystemen mit einer Unterschiedlichen Auflösung der Zeitstempel-Informationen liegen. Da kann aber Python nichts dafür.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Falls es wirklich an der Auflösung liegt, arbeitest du einfach mit einem Threshold zum Vergleichen.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

BlackJack hat geschrieben:@joh#: ``ls -l`` zeigt in der Regel nicht die volle Auflösung des Zeitstempels. Wie sehen denn die `st_mtime`-Attribute aus?
sorry, bin grade etwas begriffsstutzig, was für Attribute denn?.

os.stat wird lt (z.B.):
http://stackoverflow.com/questions/8376 ... -directory doch einfach so benutzt:

Code: Alles auswählen

os.stat(filename).st_mtime
oder so?

Code: Alles auswählen

os.stat(filename)[stat.ST_MTIME]
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

ms4py hat geschrieben:Falls es wirklich an der Auflösung liegt, arbeitest du einfach mit einem Threshold zum Vergleichen.
Hast Du vielleicht noch 2 Zeilen code dazu übrig?
Gruß
joh
BlackJack

@joh#: Ich wollte wissen an was für Werte die `st_time`-Attribute in dem konkreten Fall gebunden sind. Lass Dir die Zahlen doch mal ausgeben, die Du da vergleichst.

Threshold: Die beiden Zeiten voneinander abziehen und nur kopieren wenn das Ergebnis einen bestimmten Wert überschreitet. Oder unterschreitet -- je nach dem in welcher Reihenfolge Du die Subtraktion machst.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

BlackJack hat geschrieben:Threshold: Die beiden Zeiten voneinander abziehen und nur kopieren wenn das Ergebnis einen bestimmten Wert überschreitet. Oder unterschreitet -- je nach dem in welcher Reihenfolge Du die Subtraktion machst.
Ein `abs` wäre wohl eher angebracht, weil man nie weiß, welche Zahl größer oder kleiner ist.

Code: Alles auswählen

THRESHOLD = 0.001
if abs(val1 - val2) > THRESHOLD:
    do_copy()
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

BlackJack hat geschrieben:@joh#: Ich wollte wissen an was für Werte die `st_time`-Attribute in dem konkreten Fall gebunden sind. Lass Dir die Zahlen doch mal ausgeben, die Du da vergleichst.

Threshold: Die beiden Zeiten voneinander abziehen und nur kopieren wenn das Ergebnis einen bestimmten Wert überschreitet. Oder unterschreitet -- je nach dem in welcher Reihenfolge Du die Subtraktion machst.
Das mit dem Schwellwert (hier vielleicht 5.0) scheint schon sinnvoll, da ich ziemlich eng beieinander liegende Werte erhalte:
  • 1301041314.46
    1301041314.0

    1301345740.15
    130134574


    1301491812.0
    1301491810.08

    1301487152.0
    1301487151.0

    1301486980.0
    1301486979.59
(jeweils für datei1/datei2)
Masseinheit scheit Sekunde zu sein, obwohl die Bearbeitungszeiten viel weiter auseinander liegen müssten.
Das Ganze soll dazu dienen, zwischen einem linux und einem winXP-PC Dateien über einen Stick (vfat32)
hin und her zu kopieren. Vielleicht liegt's ja an den Filesystemen.
Zuletzt geändert von joh# am Donnerstag 31. März 2011, 08:58, insgesamt 1-mal geändert.
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

[quote="ms4py"]Ein `abs` wäre wohl eher angebracht, weil man nie weiß, welche Zahl größer oder kleiner ist.

Code: Alles auswählen

THRESHOLD = 0.001
if abs(val1 - val2) > THRESHOLD:
    do_copy()
Wenn die falsche größer ist, ist das in meinem Fall ein Grund zu meckern,
damit nicht neues mit altem überschrieben wird
BlackJack

@joh#: Um zu wissen ob die "falsche" Zeitangabe grösser/kleiner ist, müsstest Du dann aber doch Wissen über die Auflösung der Zeitstempel der beiden Dateien haben. Und die variiert relativ stark. FAT32 hat nur eine 2s Auflösung, Unix "traditionell" eine 1s Auflösung, aber ext4 zum Beispiel eine Nanosekunde.
Antworten