Портативное решение Python 2/3
Чтобы вычислить контрольную сумму (md5, sha1 и т. Д.), Вы должны открыть файл в двоичном режиме, потому что вы суммируете байтовые значения:
Чтобы быть переносимым py27 / py3, вы должны использовать io
пакеты, например так:
import hashlib
import io
def md5sum(src):
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
content = fd.read()
md5.update(content)
return md5
Если ваши файлы большие, вы можете предпочесть чтение файла по частям, чтобы избежать хранения всего содержимого файла в памяти:
def md5sum(src, length=io.DEFAULT_BUFFER_SIZE):
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
for chunk in iter(lambda: fd.read(length), b''):
md5.update(chunk)
return md5
Хитрость здесь в том, чтобы использовать iter()
функцию с часовым (пустая строка).
Созданный в этом случае итератор будет вызывать o [лямбда-функцию] без аргументов для каждого вызова своего next()
метода; если возвращаемое значение равно часовому, StopIteration
будет повышено, в противном случае будет возвращено значение.
Если ваши файлы действительно большие, вам также может понадобиться отобразить информацию о прогрессе. Вы можете сделать это, вызвав функцию обратного вызова, которая печатает или записывает количество вычисленных байтов:
def md5sum(src, callback, length=io.DEFAULT_BUFFER_SIZE):
calculated = 0
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
for chunk in iter(lambda: fd.read(length), b''):
md5.update(chunk)
calculated += len(chunk)
callback(calculated)
return md5