Вопрос по python, file – посмотрите, имеют ли два файла одинаковый контент в python [дубликаты]

33

Possible Duplicates:
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 каждый файл и сравнить. Есть ли способ лучше?

Это дубликатstackoverflow.com/questions/254350 pufferfish

Ваш Ответ

2   ответа
4

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

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

  • Compare file sizes first, discarding all which doesn't match
  • If file sizes match, compare using the biggest hash you can handle, hashing chunks of files to avoid reading the whole big file

Здесь ответ сРеализации Python (Я предпочитаю один по nosklo, кстати)

68

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

Обычно побайтовое сравнение будет достаточным и эффективным, что модуль filecmp уже делает + и другие вещи.

Увидетьhttp://docs.python.org/library/filecmp.html например

>>> import filecmp
>>> filecmp.cmp('file1.txt', 'file1.txt')
True
>>> filecmp.cmp('file1.txt', 'file2.txt')
False

Speed consideration: Обычно, если нужно сравнивать только два файла, хеширование и сравнение их будет медленнее, чем простое побайтовое сравнение, если это будет сделано эффективно. например Приведенный ниже код пытается рассчитать время хэширования за байтом

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

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
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы