Przenośne rozwiązanie Python 2/3
Aby obliczyć sumę kontrolną (md5, sha1 itp.), Musisz otworzyć plik w trybie binarnym, ponieważ sumujesz wartości bajtów:
Aby być przenośnym py27 / py3, powinieneś użyć takich io
pakietów:
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
Jeśli twoje pliki są duże, możesz chcieć przeczytać plik po kawałkach, aby uniknąć przechowywania całej zawartości pliku w pamięci:
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
Sztuczka polega na tym, aby użyć iter()
funkcji z wartownikiem (pusty ciąg znaków).
Iterator utworzony w tym przypadku wywoła o [funkcję lambda] bez argumentów dla każdego wywołania swojej next()
metody; jeśli zwrócona wartość jest równa wartownikowi, StopIteration
zostanie podniesiona, w przeciwnym razie wartość zostanie zwrócona.
Jeśli Twoje pliki są naprawdę duże, może być konieczne wyświetlenie informacji o postępach. Możesz to zrobić, wywołując funkcję zwrotną, która drukuje lub rejestruje obliczoną liczbę bajtów:
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