Una solución portátil Python 2/3
Para calcular una suma de comprobación (md5, sha1, etc.), debe abrir el archivo en modo binario, ya que sumará los valores de bytes:
Para ser portátil py27 / py3, debe usar los io
paquetes, de esta manera:
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 sus archivos son grandes, puede preferir leer el archivo por partes para evitar almacenar todo el contenido del archivo en la 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
El truco aquí es usar la iter()
función con un centinela (la cadena vacía).
El iterador creado en este caso llamará a o [la función lambda] sin argumentos para cada llamada a su next()
método; si el valor devuelto es igual a centinela, se StopIteration
elevará, de lo contrario, se devolverá el valor.
Si sus archivos son realmente grandes, es posible que también necesite mostrar información de progreso. Puede hacerlo llamando a una función de devolución de llamada que imprime o registra la cantidad de bytes calculados:
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