Подтвердить что ты не робот

См., если два файла имеют одинаковое содержимое в python

Возможные дубликаты:
Поиск дубликатов файлов и их удаление.
В Python есть ли сжатый способ сравнения, совпадают ли содержимое двух текстовых файлов?

Что является самым простым способом увидеть, являются ли два файла одинаковыми по содержанию в Python.

Одна вещь, которую я могу сделать, это md5 каждый файл и сравнить. Есть ли лучший способ?

4b9b3361

Ответ 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

Учет скорости: Обычно, если сравнивать только два файла, их хэширование и сравнение их будут медленнее вместо простого побайтового сравнения, если это будет сделано эффективно. например код ниже пытается использовать время hash vs by by by by by

Отказ от ответственности: это не лучший способ синхронизации или сравнения двух алгоритмов. и есть необходимость в улучшениях, но это дает приблизительную идею. Если вы думаете, что это должно быть улучшено, скажите мне, что я изменю его.

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

Ответ 2

Я не уверен, хотите ли вы найти дубликаты файлов или просто сравнить два отдельных файла. Если последний, вышеприведенный подход (filecmp) лучше, если первый, лучше подходит следующий подход.

Здесь много вопросов об обнаружении дубликатов файлов. Предполагая, что они не очень малы и что производительность важна, вы можете

  • Сначала сравните размеры файлов, отбросив все, что не соответствует
  • Если размеры файлов совпадают, сравните, используя самый большой хеш, который вы можете обрабатывать, хеширование фрагментов файлов, чтобы избежать чтения всего большого файла.

Вот ответ с реализациями Python (я предпочитаю одно из nosklo, BTW)