当前位置: 首页 > 面试题库 >

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

彭高畅
2023-03-14
问题内容

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

我可以做的一件事是对每个文件md5进行比较。有没有更好的办法?


问题答案:

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

通常,逐字节比较将是足够且高效的,哪个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


 类似资料:
  • 问题内容: 假设我有一个类A,而B,C,D是从A派生的。 如果我想知道所引用的对象的类型是什么,可以声明: 这是因为我确定从A派生的类只有B,C和D。 但是,如果我只想检查两个引用是否指向同一种对象,该怎么办? 所以像这样: 但是当然语法是错误的,如何在没有1000 if-else的情况下进行检查? 问题答案: 你的意思是 即使和属于相同的特定类,也应返回true 。 但是,如果与进行比较,则此方

  • 问题内容: 我有一个Shell脚本,在其中需要检查两个文件是否包含相同的数据。我对大量文件执行此操作,并且在我的脚本中,该命令似乎是性能瓶颈。 这是一行: 有没有一种比较快速的方法来比较文件,也许是自定义算法而不是默认算法? 问题答案: 我相信会在第一个字节的差异处停止:

  • 我有一个shell脚本,需要在其中检查两个文件是否包含相同的数据。我对很多文件都这样做,在我的脚本中,命令似乎是性能瓶颈。 这是一句话: 是否有一种更快的方法来比较文件,也许是一种自定义算法,而不是默认的?

  • 本文向大家介绍检查字符串的两半在Python中是否具有相同的字符集,包括了检查字符串的两半在Python中是否具有相同的字符集的使用技巧和注意事项,需要的朋友参考一下 我们必须检查在Python中,字符串的两半是否具有相同的字符集。两半中字符的频率必须相同。如果字符串的长度是奇数,请忽略中间的字符并检查其余字符。请按照以下步骤编写程序代码。 算法 让我们编写代码。 示例 输出结果 如果运行上述程序

  • 问题内容: 我不在乎有什么区别。我只想知道内容是否不同。 问题答案: 低级方式: 高级方式:

  • 如何检查两个数组(循环)是否具有相同顺序的相同元素。例如,让我们以数组[1,2,3,4]为例。 对于[2,3,4,1]、[3,4,1,2]、[4,1,2,3],测试应返回true,但对于[1,3,2,4]、[1,4,2,3]或[1,2,3,5]则不返回true。 我最初的方法是找到第一个匹配项——每个数组中一个相等的元素——并将这两个元素视为各自数组的初始元素,我逐个比较了数组的其余元素。 有没有