小编典典

在Python 3中使用hashlib计算文件的md5摘要

python

使用python 2.7时,以下代码计算文件内容的mD5十六进制值。

(编辑:好吧,并不是我真正回答的那样,我只是这么认为)。

import hashlib

def md5sum(filename):
    f = open(filename, mode='rb')
    d = hashlib.md5()
    for buf in f.read(128):
        d.update(buf)
    return d.hexdigest()

现在,如果我使用python3运行该代码,它将引发TypeError异常:

    d.update(buf)
TypeError: object supporting the buffer API required

我发现我可以使代码在python2和python3都运行的情况下将其更改为:

def md5sum(filename):
    f = open(filename, mode='r')
    d = hashlib.md5()
    for buf in f.read(128):
        d.update(buf.encode())
    return d.hexdigest()

现在我仍然想知道为什么原始代码停止工作。似乎在使用二进制模式修饰符打开文件时,它返回整数,而不是编码为字节的字符串(我之所以这么说是因为type(buf)返回int)。这种行为在某处得到了解释吗?


阅读 220

收藏
2020-12-20

共1个答案

小编典典

我认为您希望for循环连续调用f.read(128)。可以使用 iter()functools.partial() 来完成:

import hashlib
from functools import partial

def md5sum(filename):
    with open(filename, mode='rb') as f:
        d = hashlib.md5()
        for buf in iter(partial(f.read, 128), b''):
            d.update(buf)
    return d.hexdigest()

print(md5sum('utils.py'))
2020-12-20