【问题标题】:see if two files have the same content in python [duplicate]查看两个文件在python中是否具有相同的内容[重复]
【发布时间】:2013-06-19 23:26:05
【问题描述】:

可能的重复:
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 每个文件并进行比较。有没有更好的办法?

【问题讨论】:

  • 我对这个问题的答案很不满意。最佳答案使 filecmp.cmp(a, b) 看起来像 逐字节 比较文件,它非常不! 它只是检查缓存的 os.stat() 签名,它对我来说至少导致误报。只有filecmp.cmp(a, b, shallow=True) 进行真正的逐字节比较。
  • @xjcl 我想你的意思是shallow=False
  • @kuzzooroo 是的,该死的!

标签: python file


【解决方案1】:

是的,如果您必须比较多个文件并存储哈希值以供以后比较,我认为对文件进行哈希处理是最好的方法。由于哈希可能会发生冲突,因此可以根据用例进行逐字节比较。

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

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

>>> 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 文件cmp
  • 如果您有许多大文件,那么当简单的哈希计算可行时,没有理由进行昂贵的逐字节比较。
  • @vinko 通常 hash 应该比逐字节 cmp 慢,但是由于逐字节 cmp 将在 python for 循环中,我认为它会更慢,就像 filecmp 的情况一样实施
  • 好吧,对于一个实际的测试,一个哈希用于此目的的好处的测试,你应该将一个(相同的)“文件”与许多不同的文件进行比较,而不仅仅是一对。万一我以前不清楚:当然,我同意在将每个文件与另一个文件进行比较的情况下,逐字节比较会更快(毕竟你必须阅读整个文件并进行计算获取哈希),当您想将一个文件与许多其他文件进行比较时,情况开始发生变化,其中计算哈希的成本通过比较次数得到补偿。
  • filecmp(f1,f2) 默认不只比较两个文件的统计数据,而不是它们的实际字节数?除非我弄错了,否则我认为这不是理想的行为filecmp
【解决方案2】:

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

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

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

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

【讨论】:

  • 如果比较文件末尾有额外的换行符或空格,即使它们的内容相同,文件大小也可能不同
猜你喜欢
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
相关资源
最近更新 更多