Портативне рішення 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