当前位置:  开发笔记 > 编程语言 > 正文

在Python中,是否有一种简洁的方法来比较两个文本文件的内容是否相同?

如何解决《在Python中,是否有一种简洁的方法来比较两个文本文件的内容是否相同?》经验,为你挑选了4个好方法。

我不在乎差异是什么.我只是想知道内容是否不同.



1> Federico A. ..:

低级方式:

from __future__ import with_statement
with open(filename1) as f1:
   with open(filename2) as f2:
      if f1.read() == f2.read():
         ...

高层次的方式:

import filecmp
if filecmp.cmp(filename1, filename2, shallow=False):
   ...


我纠正了你的filecmp.cmp调用,因为如果没有非真正的浅层参数,它就不会执行问题所要求的操作.
如果文件很大,这可能会有问题.如果你做的第一件事是比较文件大小,你可以节省计算机的一些努力.如果尺寸不同,显然文件是不同的.如果大小相同,您只需要读取文件.
你是对的.http://www.python.org/doc/2.5.2/lib/module-filecmp.html.非常感谢你.
我刚刚发现`filecmp.cmp()`还比较元数据,例如inode数和ctime以及其他统计信息。在我的用例中,这是不可取的。如果您只想比较内容而不比较元数据,则`f1.read()== f2.read()`可能是一种更好的方法。

2> Rich..:

如果你想提高基本效率,你可能想先检查文件大小:

if os.path.getsize(filename1) == os.path.getsize(filename2):
  if open('filename1','r').read() == open('filename2','r').read():
    # Files are the same.

这样可以节省您读取两个文件大小相同的每一行,因此不能相同.

(更进一步,你可以调用每个文件的快速MD5sum并比较它们,但这不是"在Python中",所以我会在这里停止.)


当您考虑文件不相同的情况时尤其如此.按块比较可以提前纾困,但md5sum必须继续读取整个文件.
md5sum方法只需要2个文件就会变慢(你仍然需要读取文件来计算总和).当你在几个文件中寻找重复时,它只会得到回报.
没有理由期望md5sum的文件读取速度比python快 - IO非常独立于语言.大文件问题是迭代块(或使用filecmp)的原因,而不是使用md5,你不必要额外支付额外的CPU罚款.

3> tzot..:

这是一个功能风格的文件比较功能.如果文件大小不同,它立即返回False; 否则,它读入4KiB块大小并在第一个差异时立即返回False:

from __future__ import with_statement
import os
import itertools, functools, operator

def filecmp(filename1, filename2):
    "Do the two files have exactly the same contents?"
    with open(filename1, "rb") as fp1, open(filename2, "rb") as fp2:
        if os.fstat(fp1.fileno()).st_size != os.fstat(fp2.fileno()).st_size:
            return False # different sizes ? not equal
        fp1_reader= functools.partial(fp1.read, 4096)
        fp2_reader= functools.partial(fp2.read, 4096)
        cmp_pairs= itertools.izip(iter(fp1_reader, ''), iter(fp2_reader, ''))
        inequalities= itertools.starmap(operator.ne, cmp_pairs)
        return not any(inequalities)

if __name__ == "__main__":
    import sys
    print filecmp(sys.argv[1], sys.argv[2])

只是一个不同的采取:)



4> 小智..:

由于我不能评论别人的答案,我会写自己的.

如果你使用md5,你肯定不能只是md5.update(f.read()),因为你会使用太多的内存.

def get_file_md5(f, chunk_size=8192):
    h = hashlib.md5()
    while True:
        chunk = f.read(chunk_size)
        if not chunk:
            break
        h.update(chunk)
    return h.hexdigest()


@Jeremy Cantrell:一个计算哈希值,当它们被缓存/存储,或者与缓存/存储的哈希值进行比较时.否则,只需比较字符串.无论硬件是什么,str1!= str2都比md5.new(str1).digest()!= md5.new(str2).digest()快.哈希也有碰撞(不太可能但不是不可能).
推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有