查看两个文件内容是否相同的Python方法
在Python中,检查两个文件内容是否相同的最简单方法是什么?
我能做的一件事是对每个文件进行md5哈希,然后进行比较。还有没有更好的方法?
2 个回答
7
我不太确定你是想找重复的文件,还是只是比较两个单独的文件。如果是后者,上面的办法(filecmp)更好;如果是前者,下面的方法更合适。
这里有很多关于检测重复文件的问题。假设文件不太小,而且性能很重要,你可以这样做:
- 先比较文件大小,直接把那些不匹配的文件扔掉
- 如果文件大小匹配,就用你能处理的最大哈希值来比较,分块哈希文件,这样就不用一次性读取整个大文件
这里有一个带有Python实现的答案(顺便说一下,我更喜欢nosklo的那个)
183
是的,我觉得对文件进行哈希处理是比较多个文件并存储哈希值以便后续比较的最佳方法。不过,由于哈希值可能会出现冲突,所以在某些情况下,还是需要逐字节比较文件内容。
一般来说,逐字节比较就足够且高效,而这正是 filecmp
模块所做的事情,还有其他一些功能。
你可以查看这个链接了解更多信息:http://docs.python.org/library/filecmp.html,例如:
>>> import filecmp
>>> filecmp.cmp('file1.txt', 'file1.txt')
True
>>> filecmp.cmp('file1.txt', 'file2.txt')
False
需要注意的是,默认情况下,filecmp
不会比较文件的内容。如果你想要比较内容,可以添加第三个参数 shallow=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