Python 2/3 taşınabilir bir çözüm
Bir sağlama toplamı (md5, sha1 vb.) Hesaplamak için dosyayı ikili modda açmalısınız, çünkü bayt değerlerini toplarsınız:
Py27 / py3 taşınabilir olmak için, io
paketleri aşağıdaki gibi kullanmalısınız :
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
Dosyalarınız büyükse, dosya içeriğinin tamamını bellekte saklamaktan kaçınmak için dosyayı yığınlarla okumayı tercih edebilirsiniz:
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
Buradaki hile, iter()
işlevi bir sentinel (boş dize) ile kullanmaktır.
Bu durumda oluşturulan yineleyici , yönteme yapılan her çağrı için argüman olmadan o [lambda işlevi] 'ni çağırır next()
; döndürülen değer sentinel değerine eşitse StopIteration
yükseltilir, aksi takdirde değer döndürülür.
Dosyalarınız gerçekten büyükse, ilerleme durumu bilgilerini de görüntülemeniz gerekebilir. Bunu, hesaplanan bayt miktarını yazdıran veya kaydeden bir geri arama işlevini çağırarak yapabilirsiniz:
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