可能的重复项:
查找重复文件并删除它们。
在Python中,是否有一种简洁的方法来比较两个文本文件的内容是否相同?
在Python中,判断两个文件在内容上是否相同的最简单方法是什么?
我可以对每个文件进行md5处理然后进行比较。是否有更好的方法?
我可以对每个文件进行md5处理然后进行比较。是否有更好的方法?
>>> 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
filecmp.cmp(a, b)
是通过逐字节比较文件的,但实际上它完全不是! 它只是检查缓存的os.stat()
签名,这对我来说至少导致了错误的结果。只有filecmp.cmp(a, b, shallow=True)
才会进行真正的逐字节比较。 - xjclshallow=False
。 - kuzzooroo