[英]Get relative path of file1 (relative to path of file2, file1 is in subfolder of file2)
[英]File modification times not equal after calling shutil.copystat(file1, file2) under Windows
我用Python 2.7.5運行以下代碼。 在Windows下:
import os, shutil, stat, time
with open('test.txt', 'w') as f: pass # create an arbitrary file
shutil.copy('test.txt', 'test2.txt') # copy it
shutil.copystat('test.txt', 'test2.txt') # copy its stats, too
t1 = os.lstat('test.txt').st_mtime # get the time of last modification for both files
t2 = os.lstat('test2.txt').st_mtime
print t1 # prints something like: 1371123658.54
print t2 # prints the same string, as expected: 1371123658.54
print t1 == t2 # prints False! Why?!
我希望兩個時間戳(=浮點數)相等(如其字符串表示所示),那么為什么t1 == t2
計算為False
?
此外,我無法使用更少的代碼重現此行為,即無需比較從兩個不同文件通過os.lstat
檢索的時間戳。 我有這種感覺,我在這里錯過了一些微不足道的東西......
True
,但不會超過每10次運行一次。
print ("%.7f" % t1) # prints eg 1371126279.1365688 print ("%.7f" % t2) # prints eg 1371126279.1365681
這提出了兩個新問題:
shutil.copystat
后,為什么時間戳不相等? print
輪次浮動默認情況下?! 問題是在copystat
調用期間在不同格式之間進行轉換。 這是因為Windows以固定點十進制格式存儲文件時間,而Python以浮點二進制格式存儲它們。 因此,每次在兩種格式之間進行轉換時,都會丟失一些准確性。 在copystat
調用期間:
os.stat
的調用將Windows格式轉換為Python的浮點格式。 一些准確性會丟失。 os.utime
來更新文件時間。 這會將其轉換回Windows格式。 某些准確度再次丟失,文件時間不一定與第一個文件相同。 當您自己調用os.lstat
,將執行第三次不准確的轉換。 由於這些轉換,文件時間不完全相同。
請注意,您在此處設置的確切時間可能不會由后續的stat()調用返回,具體取決於操作系統記錄訪問和修改時間的分辨率
關於你的第二個問題(為什么print
似乎顯示兩者的相同值):使用str(f)
或print f
將浮點值轉換為字符串將使值四舍五入。 要獲得保證對於不同浮點值唯一的值,請使用print repr(f)
。
from decimal import *
print Decimal(t1)
print Decimal(t2)
對圓形()使用t1和t2
嘗試以浮點方式print float.hex( t1 - t2)
: print float.hex( t1 - t2)
結果:
0x1.0000000000000p-22
0x1.8000000000000p-21
0x0.0p+0
0x1.0000000000000p-20
我的猜測是:輸出的變化來自浮點表示偏差和舍入誤差。 無論如何,在比較兩個float時,你應該總是使用epsilon值。
編輯:檢查這個Python錯誤 。
這是系統限制。 底層文件系統支持文件戳的納秒分辨率,stat(2)也支持報告它們。 但是,utimes(2)在設置時僅支持微秒分辨率。
在比較兩個浮點數時,您必須使用微秒分辨率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.