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

我使用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?!

我希望两个时间戳(= floats)都相等(如其字符串表示所暗示的),那么为什么t1 == t2求和为False?


另外,我无法用更少的代码来重现此行为,即,如果不比较os.lstat从两个不同文件中检索到的时间戳。我有种感觉,我在这里错过了一些琐碎的事情...

经过进一步测试,我注意到它确实会True偶尔打印一次,但不会经常每10次运行一次。

如larsmans所建议:

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

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

这就提出了两个新的问题:


为什么呼叫后时间戳不相等shutil.copystat?

print 默认情况下,四舍五入为浮点数?!


HUH函数
浏览 395回答 3
3回答

杨魅力

问题在于copystat通话期间不同格式之间的转换。这是因为Windows将文件时间存储为定点十进制格式,而Python将它们存储为浮点二进制格式。因此,每次在两种格式之间进行转换时,都会损失一些精度。copystat通话期间:os.stat将Windows格式转换为Python浮点格式的调用。某些准确性会丢失。os.utime被称为更新文件时间。这会将其转换回Windows格式。某些准确性再次丢失,文件时间不一定与第一个文件相同。当您打电话给os.lstat自己时,将执行第三次不准确的转换。由于进行了这些转换,因此文件时间并不完全相同。的文档中os.utime提到了这一点:请注意,根据操作系统记录访问和修改时间的分辨率,后续的stat()调用可能不会返回您在此处设置的确切时间。关于第二个问题(为什么两个print似乎都显示相同的值):将浮点值转换为带有str(f)或的字符串print f将舍入该值。要获得保证对于不同的浮点值唯一的值,请print repr(f)改用。

慕侠2389804

from decimal import *print Decimal(t1)print Decimal(t2)对t1和t2使用round()

蓝山帝景

尝试在浮点数中打印时差: print float.hex( t1 - t2)结果:0x1.0000000000000p-220x1.8000000000000p-210x0.0p+00x1.0000000000000p-20我的2cents猜测:输出的变化来自浮点表示偏差和舍入误差。无论如何,在比较两个浮点数时,应始终使用epsilon值。编辑:检查此Python错误。这是系统限制。底层文件系统支持文件戳的纳秒分辨率,并且stat(2)还支持报告它们。但是,utimes(2)设置时仅支持微秒分辨率。比较两个浮点数时,您最多只能使用微秒分辨率。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python