Вопрос по python, file – посмотрите, имеют ли два файла одинаковый контент в python [дубликаты]
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 каждый файл и сравнить. Есть ли способ лучше?
Я не уверен, хотите ли вы найти дубликаты файлов или просто сравнить два отдельных файла. Если последнее, вышеупомянутый подход (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, кстати)
Да, я думаю, что хэширование файла будет лучшим способом, если вам нужно сравнить несколько файлов и сохранить хеши для последующего сравнения. Поскольку хэш может конфликтовать, побайтовое сравнение может быть сделано в зависимости от варианта использования.
Обычно побайтовое сравнение будет достаточным и эффективным, что модуль 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