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

Jos*_*son 45 python file

可能重复:
查找重复文件并删除它们.
在Python中,是否有一种简洁的方法来比较两个文本文件的内容是否相同?

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

我能做的一件事是每个文件md5并进行比较.有没有更好的办法?

Anu*_*yal 86

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

通常逐字节比较将是充分和有效的,filecmp模块已经做了+其他事情.

请参阅http://docs.python.org/library/filecmp.html 例如

>>> import filecmp
>>> filecmp.cmp('file1.txt', 'file1.txt')
True
>>> filecmp.cmp('file1.txt', 'file2.txt')
False
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

而输出是

cmpHash 0.234999895096
cmpByteByByte 0.0
Run Code Online (Sandbox Code Playgroud)

  • 当简单的逐字节比较工作时,没有理由做一个昂贵的哈希.+1为filecmp (12认同)
  • 如果您有许多大文件,那么当简单的哈希计算可行时,没有理由进行昂贵的逐字节比较. (11认同)
  • 不要忘记你可以有哈希碰撞!如果哈希比较OK,则必须通过比较文件内容来继续. (4认同)
  • `filecmp(f1,f2)` 不是默认只比较两个文件的统计信息,而不是它们的实际字节数吗?除非我弄错了,否则我认为这不是所需的行为 [filecmp](https://docs.python.org/2/library/filecmp.html) (4认同)
  • @vinko 通常哈希应该比逐字节 cmp 慢,但是由于逐字节 cmp 将在 python for 循环中,我认为它会更慢,就像 filecmp 实现的情况一样 (3认同)
  • 好吧,对于一个真实的测试,为此目的显示散列的好处,你应该将一个(相同的)'文件'与许多不同的文件进行比较,而不仅仅是单对.如果之前我不清楚:当然我同意,对于你将每个文件与另一个文件进行逐字节比较的情况比较会更快(毕竟你必须阅读整个文件并进行计算)要获得哈希值,当您想要将一个文件与许多其他文件进行比较时,事情就会开始发生变化,其中计算哈希值的成本会通过比较次数得到补偿. (2认同)
  • @nosklo 如果您担心哈希冲突,请购买小行星保险。 (2认同)

Vin*_*vic 6

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

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

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

这是Python 实现的答案(我更喜欢 nosklo,顺便说一句)