Eine tragbare Python 2/3-Lösung
Um eine Prüfsumme (md5, sha1 usw.) zu berechnen, müssen Sie die Datei im Binärmodus öffnen, da Sie Bytewerte summieren:
Um py27 / py3 portabel zu sein, sollten Sie die io
Pakete wie folgt verwenden :
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
Wenn Ihre Dateien groß sind, ziehen Sie es möglicherweise vor, die Datei in Blöcken zu lesen, um zu vermeiden, dass der gesamte Dateiinhalt im Speicher gespeichert wird:
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
Der Trick hier besteht darin, die iter()
Funktion mit einem Sentinel (der leeren Zeichenfolge) zu verwenden.
Der in diesem Fall erstellte Iterator ruft o [die Lambda-Funktion] ohne Argumente für jeden Aufruf seiner next()
Methode auf. Wenn der zurückgegebene Wert gleich Sentinel ist, StopIteration
wird er erhöht, andernfalls wird der Wert zurückgegeben.
Wenn Ihre Dateien wirklich groß sind, müssen Sie möglicherweise auch Fortschrittsinformationen anzeigen. Sie können dies tun, indem Sie eine Rückruffunktion aufrufen, die die Anzahl der berechneten Bytes druckt oder protokolliert:
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