J'ai incorporé ci-dessous les suggestions des commentaires. Merci à tous !
python < 3.7
import hashlib
def checksum(filename, hash_factory=hashlib.md5, chunk_num_blocks=128):
h = hash_factory()
with open(filename,'rb') as f:
for chunk in iter(lambda: f.read(chunk_num_blocks*h.block_size), b''):
h.update(chunk)
return h.digest()
python 3.8 et plus
import hashlib
def checksum(filename, hash_factory=hashlib.md5, chunk_num_blocks=128):
h = hash_factory()
with open(filename,'rb') as f:
while chunk := f.read(chunk_num_blocks*h.block_size):
h.update(chunk)
return h.digest()
poste original
Si vous souhaitez une méthode plus pythique (pas de 'while True') pour lire le fichier, consultez ce code :
import hashlib
def checksum_md5(filename):
md5 = hashlib.md5()
with open(filename,'rb') as f:
for chunk in iter(lambda: f.read(8192), b''):
md5.update(chunk)
return md5.digest()
Notez que le func iter() a besoin d'une chaîne d'octets vide pour que l'itérateur retourné s'arrête à EOF, puisque read() retourne b'' (et pas seulement '').
22 votes
Je reformulerais : "Comment obtenir le has MD5 d'un fichier sans charger tout le fichier en mémoire ?".