Python 是否忽略不同的os.stat()签名?

Python 是否忽略不同的os.stat()签名?,python,file-comparison,Python,File Comparison,Python 2文档用于: 除非给出的值为false,否则具有相同签名的文件被视为相等 这听起来像是两个相同的文件,除了它们的os.stat()签名之外,将被认为是不相等的,但是情况似乎并非如此,如运行以下代码段所示: import filecmp import os import shutil import time with open('test_file_1', 'w') as f: f.write('file contents') shutil.copy('test_file_

Python 2文档用于:

除非给出的值为false,否则具有相同签名的文件被视为相等

这听起来像是两个相同的文件,除了它们的
os.stat()
签名之外,将被认为是不相等的,但是情况似乎并非如此,如运行以下代码段所示:

import filecmp
import os
import shutil
import time

with open('test_file_1', 'w') as f:
    f.write('file contents')
shutil.copy('test_file_1', 'test_file_2')
time.sleep(5)  # pause to get a different time-stamp
os.utime('test_file_2', None)  # change copied file's time-stamp

print 'test_file_1:', os.stat('test_file_1')
print 'test_file_2:', os.stat('test_file_2')
print 'filecmp.cmp():', filecmp.cmp('test_file_1', 'test_file_2')
输出:

test\u file\u 1:nt.stat\u result(st\u mode=33206,st\u ino=0L,st\u dev=0,st\u nlink=0,
标准uid=0,标准gid=0,标准尺寸=13L,标准时间=1320719522L,标准时间=1320720444L,
标准时间=1320719522L)
测试文件2:nt.stat结果(st模式=33206,st模式=0L,st模式=0,st模式=0,
标准uid=0,标准gid=0,标准尺寸=13L,标准时间=1320720504L,标准时间=1320720504L,
标准时间=1320719539L)
filecmp.cmp():True
正如您所看到的,这两个文件的时间戳-
st_atime
st_mtime
st_ctime
-显然不相同,但是
filecmp.cmp()
表明这两个文件是相同的。我是否误解了什么,或者
filecmp.cmp()
的实现或文档中是否存在错误

更新

Python3已经被重新表述,目前说的是以下内容,IMHO是一个改进,只是它更好地意味着具有不同时间戳的文件可能仍然被认为是相等的,即使
shall
是真的

如果为true,则将删除具有相同签名的文件 被认为是平等的。否则,将比较文件的内容

FWIW我认为最好只是说这样的话:

如果为true,则仅当 签名是不平等的


你误解了文件。第2行说:

除非给出SHELFLOW且为false,否则签名相同的文件将被视为相等

签名相同的文件被认为是相等的,但事实并非如此:签名不相等的文件不一定是不等的。相反,它们可能不相等,在这种情况下,会比较实际的文件内容。由于发现文件内容相同,
filecmp.cmp()
返回
True


根据第三条,一旦确定文件相等,它将缓存该结果,并且如果您要求它再次比较相同的文件,它将不会重新读取文件内容,只要这些文件的os.stat结构不发生变化。

看起来“自己滚动”确实是产生理想结果所必需的。如果文档足够清晰,让随便的读者都能得出这样的结论,那就太好了

以下是我目前使用的函数:

def cmp_stat_weak(a, b):
    sa = os.stat(a)
    sb = os.stat(b)
    return (sa.st_size == sb.st_size and sa.st_mtime == sb.st_mtime)

是的,我假设第2行的逻辑倒数是真的。谢谢是否有一个内置的Python会认为它们是不相等的,还是必须自己滚动?在定位和检查FielcMP.Py的代码之后,我现在可以清楚地看到什么是<代码> cMP-()/<代码>,我认为这与文档不一致。当
shallow
被赋予(或默认值)一个真值时,它不会被接受,因为文件不会被读取,除非它们基于
os.stat()
的签名匹配。在我看来,如果
shallow
是真的,就永远不应该比较它们的内容,而只应该考虑它们的签名——这就是文档所说的和我所希望的行为。是的,我认为
filecmp.cmp()
使用它的
shallow
选项会做这种比较,但如何做到这一点并不是我的问题——除了创建一个替换what函数does的drop外,还有一点比这个更复杂。而且,我不认为自己是一个“随便的读者”,因为我对文档的理解是肤浅的或肤浅的,这是完全相反的。“典型”是个更好的形容词。