Использование hashlib для вычисления дайджеста md5 файла в Python 3

В 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). Это поведение где-то объясняется?

22
задан tshepang 11 February 2014 в 12:15
поделиться