Giải pháp di động Python 2/3
Để tính toán tổng kiểm tra (md5, sha1, v.v.), bạn phải mở tệp ở chế độ nhị phân, vì bạn sẽ tính tổng các giá trị byte:
Để có thể mang theo py27 / py3, bạn nên sử dụng các io
gói, như thế này:
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
Nếu tệp của bạn lớn, bạn có thể thích đọc tệp theo từng đoạn để tránh lưu trữ toàn bộ nội dung tệp trong bộ nhớ:
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
Mẹo ở đây là sử dụng iter()
hàm với sentinel (chuỗi rỗng).
Trình lặp được tạo trong trường hợp này sẽ gọi o [hàm lambda] không có đối số cho mỗi lệnh gọi đến next()
phương thức của nó ; nếu giá trị được trả về bằng sentinel, StopIteration
sẽ được nâng lên, nếu không giá trị sẽ được trả về.
Nếu các tệp của bạn thực sự lớn, bạn cũng có thể cần hiển thị thông tin tiến trình. Bạn có thể làm điều đó bằng cách gọi một hàm gọi lại in hoặc ghi lại số lượng byte được tính toán:
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