【问题标题】:Does filecmp do an exact comparison?filecmp 是否进行精确比较?
【发布时间】:2021-03-15 21:05:28
【问题描述】:

filecmp.cmp documentation 状态(强调我的)

比较名为 f1f2 的文件,如果它们看起来相等则返回 True,否则返回 False
如果 shallow 为真,则具有相同 os.stat() 签名的文件被视为相等。否则,将比较文件的内容。

似乎在这里是什么意思?我的理解是,对于shallow=False,文件的内容会进行比较,因此文件是否相同或不同。

【问题讨论】:

标签: python python-3.x file compare


【解决方案1】:

源代码相当简单;在filecmp 模块的文档页面中有一个指向它的链接,在顶部:

def cmp(f1, f2, shallow=True):
    """Compare two files.
    Arguments:
    f1 -- First file name
    f2 -- Second file name
    shallow -- Just check stat signature (do not read the files).
               defaults to True.
    Return value:
    True if the files are the same, False otherwise.
    This function uses a cache for past comparisons and the results,
    with cache entries invalidated if their stat information
    changes.  The cache may be cleared by calling clear_cache().
    """

    s1 = _sig(os.stat(f1))
    s2 = _sig(os.stat(f2))
    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

    outcome = _cache.get((f1, f2, s1, s2))
    if outcome is None:
        outcome = _do_cmp(f1, f2)
        if len(_cache) > 100:      # limit the maximum size of the cache
            clear_cache()
        _cache[f1, f2, s1, s2] = outcome
    return outcome

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

def _do_cmp(f1, f2):
    bufsize = BUFSIZE
    with open(f1, 'rb') as fp1, open(f2, 'rb') as fp2:
        while True:
            b1 = fp1.read(bufsize)
            b2 = fp2.read(bufsize)
            if b1 != b2:
                return False
            if not b1:
                return True

是的,它会比较文件内容。

【讨论】:

    猜你喜欢
    • 2021-02-14
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多