gpt4 book ai didi

python - Windows下调用shutil.copystat(file1, file2)后文件修改次数不相等

转载 作者:太空狗 更新时间:2023-10-29 21:03:35 27 4
gpt4 key购买 nike

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


编辑 2: 正如 larsmans 所建议的:

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

这提出了两个新问题:

  1. 为什么调用 shutil.copystat 后时间戳不相等?
  2. print rounds floats by default?!

最佳答案

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

  1. 调用 os.stat 将 Windows 格式转换为 Python 的浮点格式。失去了一些准确性。
  2. os.utime 被调用来更新文件时间。这会将其转换回 Windows 格式。一些准确性再次丢失,文件时间不一定与第一个文件的时间相同。

当您自己调用 os.lstat 时,会执行第三次不准确的转换。由于这些转换,文件时间并不完全相同。

documentation for os.utime提到这个:

Note that the exact times you set here may not be returned by a subsequent stat() call, depending on the resolution with which your operating system records access and modification times


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

关于python - Windows下调用shutil.copystat(file1, file2)后文件修改次数不相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17086426/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com