Una soluzione portatile Python 2/3
Per calcolare un checksum (md5, sha1, ecc.), È necessario aprire il file in modalità binaria, poiché si sommeranno i valori dei byte:
Per essere portatile py27 / py3, è necessario utilizzare i io
pacchetti, in questo modo:
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
Se i tuoi file sono grandi, potresti preferire leggere il file in blocchi per evitare di memorizzare l'intero contenuto del file in memoria:
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
Il trucco qui è usare la iter()
funzione con una sentinella (la stringa vuota).
L'iteratore creato in questo caso chiamerà o [la funzione lambda] senza argomenti per ogni chiamata al suo next()
metodo; se il valore restituito è uguale a sentinella, StopIteration
verrà generato, altrimenti verrà restituito.
Se i tuoi file sono molto grandi, potresti anche dover visualizzare le informazioni sullo stato di avanzamento. Puoi farlo chiamando una funzione di callback che stampa o registra la quantità di byte calcolati:
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