【问题标题】:When will filecmp.cmp() return a false positive or false negative?filecmp.cmp() 什么时候会返回误报或误报?
【发布时间】:2017-10-03 04:05:29
【问题描述】:

使用 Windows 7,我有两个文件夹,一个是我处理文件的“主”文件夹,另一个是 NAS4Free 服务器上的“备份”文件夹。

我有 800 多个 jpg 文件,总计 2.6GB,大小从 124KB 到 16MB 不等。

我经常“交换”文件名,即:

rename 01-020.jpg 99-020.jpg
rename 01-040.jpg 01-020.jpg
rename 99-020.jpg 01-040.jpg

我还添加了新文件 - 01-030.jpg - 然后重新编号,即:

rename 01-020.jpg 99-020.jpg
rename 01-030.jpg 99-040.jpg
rename 01-040.jpg 99-060.jpg
rename 99-020.jpg 01-020.jpg
rename 99-040.jpg 01-040.jpg
rename 99-060.jpg 01-060.jpg

为了使主文件夹和备份文件夹保持同步,我首先考虑对整个文件夹进行 XCOPY 或 ROBOCOPY,但这太耗时了,尤其是因为绝大多数文件都没有更改。

我正在尝试提出一个 Python 3 解决方案。我已经阅读了有关 filecmp.cmp() 的文档。让我担心的是声明:

“……如果它们看起来相等……则返回 True”(强调我的)。

指定 shallow=False 似乎有点过头了,导致 filecmp 比较 1,600 多个文件的内容,而绝大多数比较都会匹配。

指定 shallow=True 会导致 filecmp 使用 os.stat() 函数。使用该函数运行测试,在两个 filecmp 返回 True 的文件上,stat 返回的一些值是相同的,其他是不同的。显然,filecmp 不会使用 stat 返回的所有值来确定文件是否相等。

所以,我的问题是:在什么“真实世界”情况下 filecmp.cmp(file1, file2, shallow=True) 会返回误报或误报?我可以相信它吗?

还有一个可能的“子问题”,文件cmp.cmp() 使用os.stat() 返回的哪些具体值?

(如果你好奇我对这些文件做了什么,我在这里讨论一下:https://hikearizona.com/dex2/viewtopic.php?f=78&t=9538)

【问题讨论】:

  • 我真的很惊讶你没有更多的赞成票。这似乎是一件非常有用的事情。

标签: python python-3.x


【解决方案1】:

只有当 size 和 modified time 属性值相同时,比较才会返回 true。 仅当同时修改了相同的确切字节数时,它才会返回误报。

可用于确认上述的模块文件引用:

cmp函数实现摘录(filecmp.py)

        s1 = _sig(os.stat(f1))
        s2 = _sig(os.stat(f2))
        if shallow and s1 == s2:
            return True

上面使用的_sig函数(filecmp.py):

def _sig(st):
    return (stat.S_IFMT(st.st_mode),
            st.st_size,
            st.st_mtime)

【讨论】:

  • 这完全回答了我的问题。总结一下:如果文件模式 (st_mode) 中描述文件类型的部分 AND 文件大小(以字节为单位)AND 表示最近的内容修改时间以秒为单位的两个文件相同,则文件被视为“相等”。
猜你喜欢
  • 2012-12-19
  • 2020-11-24
  • 2019-04-28
  • 2017-11-24
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 2014-07-06
相关资源
最近更新 更多