如何在Python中检测两个文件是否相同

10 投票
8 回答
16764 浏览
提问于 2025-04-15 16:06

在这种情况下,调用系统命令“md5sum file1”和“md5sum file2”,然后比较这两个返回值,这样做够了吗?

8 个回答

13

哈希值在你需要缓存的时候很有用,比如要比较很多不同的文件。如果你只是想比较两个文件,那就太浪费资源了。毕竟,两个文件都得读取,而且每个字节都要进行大量处理。

如果是1:1的比较,直接用:

import filecmp
filecmp.cmp(file_name_1,file_name_2)

另一方面,好的哈希值是比较大量文件的唯一方法。

SHA-1和MD5有点问题,但对于普通文件来说还好。一些研究人员可以生成两个无意义的文件让它们产生冲突,但实际上很少有人能碰到已经存在的文件。

git使用SHA-1来比较文本,所以这个选择也不是太糟糕。

以下这些方法都可以用:

import hashlib
hash = hashlib.MD5(your_text_here).hexdigest() # safe*
hash = hashlib.SHA1(your_text_here).hexdigest() # safe*
hash = hashlib.SHA224(your_text_here).hexdigest() # safe
hash = hashlib.SHA512(your_text_here).hexdigest() # paranoid

# now put the hash in a dictionary (or database) for your many-to-many comparison.

#  * Meaningful files will not be clobbered. Contrived files can be generated
#    which might clash together, but it's difficult to do.
15

如果你想做的不仅仅是检查它们是否不同,或者你对哈希方法不太信任,Python的标准库里有一些模块,比如 difflibfilecmp,这些模块不需要依赖外部程序。

13

好吧,这样可以告诉你这两个文件肯定不同,还是说它们可能是一样的。虽然两个文件有可能会有相同的哈希值,但实际上数据并不相同……这只是非常不可能的事情。

在你的情况下,如果出现误判(也就是你认为它们是一样的,但实际上并不是),会有什么影响呢?MD5的哈希值大概足够用了,如果碰撞只是偶然发生的话,你也不用太担心……不过如果涉及到安全(或者钱),而且有人可能会放一个“坏”的文件,恰好和一个“好”的文件有相同的哈希值,那你就不能完全依赖它了。

就我个人而言,我可能会直接读取这两个文件,逐个字节进行比较——对于一次性的比较,无论是哈希还是这种方法,当文件内容相同的时候,都需要读取整个文件;正如Daniel在评论中提到的,逐字节比较可以让你在发现不同的时候提前退出。先比较文件大小也是一个快速的优化方法哦 :)

哈希的一个一般性好处是,当你把已有文件的哈希值存储在某个地方时,下次你只需要读取新文件就可以了。

撰写回答