根据文档,我希望如果两个文件具有不同的修改时间戳,filecmp将它们视为不同的文件。When will filecmp.cmp() return a false positive or false negative?的回答证实了这一点。
然而,我观察到了不同的行为。
环境: Windows 10上的Python3.5
设置:准备包含五个相应文件的两个目录:
实验:对目录运行filecmp.cmp_files,对每对运行filecmp.cmp并计算filecmp._sig
filecmp.clear_cache()
dc = filecmp.dircmp(os.path.join(quelle, 'aenderungen_kopieren\\Dateien'), \
os.path.join(ziel, 'aenderungen_kopieren\\Dateien'))
flag_shallow = True
(mapping, not_mapping, _) = filecmp.cmpfiles(dc.left, dc.right, dc.common_files, flag_shallow)
print('flag_shallow: ', flag_shallow)
for (list, tl) in ((mapping, 'mapping'), (not_mapping, 'not_mapping')):
print(tl, '--------------------------------------------')
for l in list:
links = os.path.join(dc.left, l)
rechts = os.path.join(dc.right, l)
print(l)
print('\t',filecmp._sig(os.stat(links)), '\n\t', filecmp._sig(os.stat(rechts)))
print('_sig: ', filecmp._sig(os.stat(links)) == filecmp._sig(os.stat(rechts)), \
'\tcmp: ', filecmp.cmp(links, rechts, shallow=flag_shallow), '\n')结果:
flag_shallow: True
mapping --------------------------------------------
neuer.txt
(32768, 6, 1583743832.8992507)
(32768, 6, 1583692574.365337)
_sig: False cmp: True
gleichalt_verschieden.txt
(32768, 8, 1583692574.365337)
(32768, 8, 1583692574.365337)
_sig: True cmp: True
gleich.txt
(32768, 6, 1583692574.365337)
(32768, 6, 1583692574.365337)
_sig: True cmp: True
aelter.txt
(32768, 6, 1583692574.365337)
(32768, 6, 1583743875.4433577)
_sig: False cmp: True
not_mapping --------------------------------------------
verschieden.txt
(32768, 7, 1583692574.365337)
(32768, 6, 1583692574.365337)
_sig: False cmp: False 问:为什么filecmp.cmp认为"neuer.txt“和"aelter.txt”对是相同的,尽管修改时间戳不同,而filecmp._sig检测到了这种差异?
发布于 2020-03-09 11:08:11
根据
文档,我希望如果两个文件具有不同的修改时间戳,filecmp会将它们视为不同的
这没什么意义。文档明确指出,如果设置了shallow,并且stat()是相同的,那么文件就被认为是相同的,否则文件的内容就会被比较。
它并没有说如果stat不同,文件就会被认为是不同的,在这种情况下,它根本就不会匹配。
shallow是一种快速得到答案的方法,有可能出现错误:如果您有两个内容不同但大小和时间完全相同的文件,那么它们将被认为是相同的,尽管不是这样。
发布于 2020-03-09 17:50:54
从源中我了解到,只有大小,而不是mtime,才能计算出差异:
def cmp(f1, f2, shallow=True):
....
if s1[0] != stat.S_IFREG or s2[0] != stat.S_IFREG:
return False
if shallow and s1 == s2:
return True
if s1[1] != s2[1]:
return False
....因此,我发现文档具有误导性:“如果浅层为真,则使用相同os.stat()签名的文件被视为相等。否则,将比较这些文件的内容。”
它应该是这样的:“如果浅层为真,则使用相同os.stat()签名的文件被视为相等,不同大小的文件被视为不同。否则,将比较这些文件的内容。”
https://stackoverflow.com/questions/60598053
复制相似问题