Une solution portable Python 2/3
Pour calculer une somme de contrôle (md5, sha1, etc.), vous devez ouvrir le fichier en mode binaire, car vous allez additionner les valeurs d'octets:
Pour être portable py27 / py3, vous devez utiliser les io
packages, comme ceci:
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
Si vos fichiers sont volumineux, vous préférerez peut-être lire le fichier par morceaux pour éviter de stocker tout le contenu du fichier en mémoire:
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
L'astuce ici est d'utiliser la iter()
fonction avec une sentinelle (la chaîne vide).
L'itérateur créé dans ce cas appellera o [la fonction lambda] sans argument pour chaque appel à sa next()
méthode; si la valeur retournée est égale à sentinel, StopIteration
sera levée, sinon la valeur sera retournée.
Si vos fichiers sont vraiment volumineux, vous devrez peut-être également afficher des informations de progression. Vous pouvez le faire en appelant une fonction de rappel qui imprime ou enregistre la quantité d'octets calculés:
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