根據檔案塊長度,依次擷取檔案内容讀入記憶體,通過update()逐次更新校驗值
import hashlib
def md5sum(fname):
""" 計算檔案的MD5值
"""
def read_chunks(fh):
fh.seek(0)
chunk = fh.read(8096)
while chunk:
yield chunk
chunk = fh.read(8096)
else: #最後要将遊标放回檔案開頭
fh.seek(0)
m = hashlib.md5()
if isinstance(fname, basestring) and os.path.exists(fname):
with open(fname, "rb") as fh:
for chunk in read_chunks(fh):
m.update(chunk)
#上傳的檔案緩存 或 已打開的檔案流
elif fname.__class__.__name__ in ["StringIO", "StringO"] or isinstance(fname, file):
for chunk in read_chunks(fname):
m.update(chunk)
else:
return ""40
return m.hexdigest()