- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用 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>
print ("%.7f" % t1) # prints e.g. 1371126279.1365688
print ("%.7f" % t2) # prints e.g. 1371126279.1365681
这提出了两个新问题:
shutil.copystat
后时间戳不相等?print
rounds floats by default?!最佳答案
问题在于 copystat
调用期间不同格式之间的转换。这是因为 Windows 以定点十进制格式存储文件时间,而 Python 以浮点二进制格式存储它们。因此,每次在两种格式之间进行转换时,都会损失一些准确性。在 copystat
调用期间:
os.stat
将 Windows 格式转换为 Python 的浮点格式。失去了一些准确性。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/
我正在尝试编写一个 python 脚本来备份一个文件夹,并将其保留 x 天。 我用 shutil.copytree(source, finaldest) 我的问题是,原始文件的时间戳仍然存在,这意味着
我使用 Python 2.7.5 运行以下代码。在 Windows 下: import os, shutil, stat, time with open('test.txt', 'w') as f:
本文整理了Java中org.apache.accumulo.fate.zookeeper.ZooCache.copyStats()方法的一些代码示例,展示了ZooCache.copyStats()的具
失败的代码在基于 python:3.6-stretch debian 的 Docker 容器内运行。当 Django 将文件从一个 Docker 卷移动到另一个 Docker 卷时,就会发生这种情况。
我是一名优秀的程序员,十分优秀!