为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUH函数 2021-03-29 11:11:22
我使用Python 2.7.5运行以下代码。在Windows下:import os, shutil, stat, timewith open('test.txt', 'w') as f: pass # create an arbitrary fileshutil.copy('test.txt', 'test2.txt') # copy itshutil.copystat('test.txt', 'test2.txt') # copy its stats, toot1 = os.lstat('test.txt').st_mtime # get the time of last modification for both filest2 = os.lstat('test2.txt').st_mtimeprint t1 # prints something like: 1371123658.54print t2 # prints the same string, as expected: 1371123658.54print t1 == t2 # prints False! Why?!我希望两个时间戳(= floats)都相等(如其字符串表示所暗示的),那么为什么t1 == t2求和为False?另外,我无法用更少的代码来重现此行为,即,如果不比较os.lstat从两个不同文件中检索到的时间戳。我有种感觉,我在这里错过了一些琐碎的事情...经过进一步测试,我注意到它确实会True偶尔打印一次,但不会经常每10次运行一次。如larsmans所建议:print ("%.7f" % t1) # prints e.g. 1371126279.1365688print ("%.7f" % t2) # prints e.g. 1371126279.1365681这就提出了两个新的问题:为什么呼叫后时间戳不相等shutil.copystat?print 默认情况下,四舍五入为浮点数?!
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

问题在于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)改用。


查看完整回答
反对 回复 2021-04-01
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

from decimal import *

print Decimal(t1)

print Decimal(t2)

对t1和t2使用round()


查看完整回答
反对 回复 2021-04-01
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

尝试在浮点数中打印时差: print float.hex( t1 - t2)


结果:


0x1.0000000000000p-22

0x1.8000000000000p-21

0x0.0p+0

0x1.0000000000000p-20

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


编辑:检查此Python错误。


这是系统限制。底层文件系统支持文件戳的纳秒分辨率,并且stat(2)还支持报告它们。但是,utimes(2)设置时仅支持微秒分辨率。


比较两个浮点数时,您最多只能使用微秒分辨率。


查看完整回答
反对 回复 2021-04-01
  • 3 回答
  • 0 关注
  • 392 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号