首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Python的filecmp报告文件在浅层模式下具有不同的修改时间?

为什么Python的filecmp报告文件在浅层模式下具有不同的修改时间?
EN

Stack Overflow用户
提问于 2020-03-09 09:51:34
回答 2查看 554关注 0票数 0

根据文档,我希望如果两个文件具有不同的修改时间戳,filecmp将它们视为不同的文件。When will filecmp.cmp() return a false positive or false negative?的回答证实了这一点。

然而,我观察到了不同的行为。

环境: Windows 10上的Python3.5

设置:准备包含五个相应文件的两个目录:

  • 三对内容相同的文件,其中两对具有不同的修改时间戳
  • ,两对内容不同,一对具有相同的长度和相同的修改时间戳(文件"gleichalt_verschieden.txt",见下文)。

实验:对目录运行filecmp.cmp_files,对每对运行filecmp.cmp并计算filecmp._sig

代码语言:javascript
运行
复制
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')

结果:

代码语言:javascript
运行
复制
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检测到了这种差异?

EN

回答 2

Stack Overflow用户

发布于 2020-03-09 11:08:11

根据

文档,我希望如果两个文件具有不同的修改时间戳,filecmp会将它们视为不同的

这没什么意义。文档明确指出,如果设置了shallow,并且stat()是相同的,那么文件就被认为是相同的,否则文件的内容就会被比较。

它并没有说如果stat不同,文件就会被认为是不同的,在这种情况下,它根本就不会匹配。

shallow是一种快速得到答案的方法,有可能出现错误:如果您有两个内容不同但大小和时间完全相同的文件,那么它们将被认为是相同的,尽管不是这样。

票数 1
EN

Stack Overflow用户

发布于 2020-03-09 17:50:54

从源中我了解到,只有大小,而不是mtime,才能计算出差异:

代码语言:javascript
运行
复制
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()签名的文件被视为相等,不同大小的文件被视为不同。否则,将比较这些文件的内容。”

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60598053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档