看看两个文件在python中是否具有相同的内容

时间:2009-07-02 04:53:23

标签: python file

  

可能重复:
  Finding duplicate files and removing them.
  In Python, is there a concise way of comparing whether the contents of two text files are the same?

在Python中查看两个文件内容是否相同的最简单方法是什么。

我能做的一件事是每个文件md5并进行比较。还有更好的方法吗?

2 个答案:

答案 0 :(得分:70)

是的,我认为如果你必须比较几个文件和存储哈希值以便以后比较,那么散列文件将是最好的方法。由于哈希可能会发生冲突,因此可以根据用例进行逐字节比较。

通常逐字节比较就足够有效了,filecmp模块已经做了+其他事情。

参见http://docs.python.org/library/filecmp.html e.g。

>>> import filecmp
>>> filecmp.cmp('file1.txt', 'file1.txt')
True
>>> filecmp.cmp('file1.txt', 'file2.txt')
False

速度考虑: 通常,如果只需要比较两个文件,则对它们进行散列并比较它们会比较慢而不是简单的逐字节比较(如果有效地完成)。例如下面的代码尝试按字节逐个时间哈希

免责声明:这不是计时或比较两个算法的最佳方式。并且需要改进但它确实给出了粗略的想法。如果您认为应该改进,请告诉我我会改变它。

import random
import string
import hashlib
import time

def getRandText(N):
    return  "".join([random.choice(string.printable) for i in xrange(N)])

N=1000000
randText1 = getRandText(N)
randText2 = getRandText(N)

def cmpHash(text1, text2):
    hash1 = hashlib.md5()
    hash1.update(text1)
    hash1 = hash1.hexdigest()

    hash2 = hashlib.md5()
    hash2.update(text2)
    hash2 = hash2.hexdigest()

    return  hash1 == hash2

def cmpByteByByte(text1, text2):
    return text1 == text2

for cmpFunc in (cmpHash, cmpByteByByte):
    st = time.time()
    for i in range(10):
        cmpFunc(randText1, randText2)
    print cmpFunc.func_name,time.time()-st

,输出

cmpHash 0.234999895096
cmpByteByByte 0.0

答案 1 :(得分:4)

我不确定您是要查找重复文件还是仅比较两个单个文件。如果是后者,上面的方法(filecmp)更好,如果是前者,下面的方法更好。

这里有很多重复文件检测问题。假设它们不是很小并且性能很重要,你可以

  • 首先比较文件大小,丢弃所有不匹配的文件
  • 如果文件大小匹配,请使用您可以处理的最大哈希进行比较,散列文件以避免读取整个大文件

这是Python implementations的答案(我更喜欢nosklo,BTW)