एक पायथन 2/3 पोर्टेबल समाधान
एक चेकसम (md5, sha1, आदि) की गणना करने के लिए, आपको बाइनरी मोड में फ़ाइल को खोलना होगा, क्योंकि आप बाइट्स विकल्पों के साथ योग करेंगे:
Py27 / py3 पोर्टेबल होने के लिए, आपको io
संकुल का उपयोग करना चाहिए , जैसे:
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
यदि आपकी फाइलें बड़ी हैं, तो आप पूरी फाइल सामग्री को मेमोरी में स्टोर करने से बचने के लिए चंक्स द्वारा फाइल को पढ़ना पसंद कर सकते हैं:
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
यहां ट्रिक iter()
को एक सेंटिनल (खाली स्ट्रिंग) के साथ फ़ंक्शन का उपयोग करना है ।
इस मामले में बनाया गया इटरेटर ओ [लैंबडा फंक्शन] को कॉल करेगा जिसके प्रत्येक next()
विधि के लिए कोई तर्क नहीं है; यदि लौटाया गया मूल्य प्रहरी के बराबर है, StopIteration
तो उठाया जाएगा, अन्यथा मान वापस कर दिया जाएगा।
यदि आपकी फाइलें वास्तव में बड़ी हैं, तो आपको प्रगति जानकारी प्रदर्शित करने की आवश्यकता हो सकती है। आप कॉलबैक फ़ंक्शन को कॉल करके कर सकते हैं जो गणना बाइट्स की मात्रा को प्रिंट या लॉग करता है:
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