簡體   English   中英

在Windows下調用shutil.copystat(file1,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次運行一次。


編輯2:正如larsmans所建議的那樣:

 print ("%.7f" % t1) # prints eg 1371126279.1365688 print ("%.7f" % t2) # prints eg 1371126279.1365681 

這提出了兩個新問題:

  1. 調用shutil.copystat后,為什么時間戳不相等?
  2. print輪次浮動默認情況下?!

問題是在copystat調用期間在不同格式之間進行轉換。 這是因為Windows以固定點十進制格式存儲文件時間,而Python以浮點二進制格式存儲它們。 因此,每次在兩種格式之間進行轉換時,都會丟失一些准確性。 copystat調用期間:

  1. os.stat的調用將Windows格式轉換為Python的浮點格式。 一些准確性會丟失。
  2. os.utime來更新文件時間。 這會將其轉換回Windows格式。 某些准確度再次丟失,文件時間不一定與第一個文件相同。

當您自己調用os.lstat ,將執行第三次不准確的轉換。 由於這些轉換,文件時間不完全相同。

os.utime文檔提到了這個:

請注意,您在此處設置的確切時間可能不會由后續的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM