在Windows下调用shutil.copystat(file1,file2)后,文件修改时间不相等

时间:2013-06-13 11:54:05

标签: python windows python-2.7 filesystems

我使用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次运行一次。

< / p>

<小时/> 编辑2: 正如larsmans所建议的那样:

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

这提出了两个新问题:

  1. 调用shutil.copystat后,为什么时间戳不相等?
  2. 默认情况下,
  3. print轮次浮动?!

3 个答案:

答案 0 :(得分:6)

问题在于copystat调用期间不同格式之间的转换。这是因为Windows以固定点十进制格式存储文件时间,而Python以浮点二进制格式存储它们。因此,每次在两种格式之间进行转换时,都会丢失一些准确性。 copystat来电期间:

  1. os.stat的调用将Windows格式转换为Python的浮点格式。一些准确性会丢失。
  2. 调用
  3. os.utime来更新文件时间。这会将其转换回Windows格式。某些准确性再次丢失,文件时间不一定与第一个文件相同。
  4. 当您自己致电os.lstat时,会执行第三次不准确的转换。由于这些转换,文件时间并不完全相同。

    documentation for os.utime提到了这个:

      

    请注意,您在此处设置的确切时间可能不会由后续的stat()调用返回,具体取决于操作系统记录访问和修改时间的分辨率


    关于您的第二个问题(为什么print似乎显示两者的相同值):将浮点值转换为包含str(f)print f的字符串将对该值进行四舍五入。要获得保证对于不同浮点值唯一的值,请改用print repr(f)

答案 1 :(得分:0)

from decimal import *
print Decimal(t1)
print Decimal(t2)

对t1和t2使用round()

答案 2 :(得分:-1)

尝试以浮点形式打印时差:print float.hex( t1 - t2)

结果:

0x1.0000000000000p-22
0x1.8000000000000p-21
0x0.0p+0
0x1.0000000000000p-20

我的2猜测:输出的变化来自浮点表示偏差和舍入误差。无论如何,在比较两个float时,你应该总是使用epsilon值。

编辑:检查此Python bug

  

这是系统限制。底层文件系统支持   文件标记的纳秒分辨率,stat(2)也支持   报告他们。但是,utimes(2)只支持微秒   设置时的分辨率。

比较两个花车时,你必须使用微秒分辨率。