Ошибка памяти Hashlib в Python 3.5, но не в 2.7

#python #python-3.x #hashlib #functools

#python #python-3.x #hashlib #функциональные средства

Вопрос:

Я перенес набор скриптов Python 2.7 на Python 3.5, чтобы я мог использовать некоторые библиотеки, недоступные в 2.7, но я получаю ошибку памяти из этого кода, который работал ранее:

 import hashlib, functools
sha2h = hashlib.sha256()
with open('/path/to/any/file', 'rb') as f:
        [sha2h.update(chunk) for chunk in iter(functools.partial(f.read, 256), '')]
  

Насколько я могу судить, это правильный способ получить хэш файла SHA256. Кажется, я ничего не могу найти по этой проблеме. Если это поможет, вот обратная трассировка, когда приведенный выше код запускается из оболочки:

 File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in <listcomp>
  

Также пробовал заменить

 sha2h = hashlib.sha256()
  

с

 sha2h = hashlib.new('sha256')
  

чтобы соответствовать документации для hashlib, но это не привело к изменению результата.

Любая помощь или понимание будут с благодарностью!

Ответ №1:

В Python 3 вам нужно установить b'' вместо '' в качестве контрольного значения для iter вызова:

 iter(functools.partial(f.read, 256), b'')
  

Вы также действительно не должны использовать понимание списка для подобных побочных эффектов, но если вы переносите существующий код, который это делает, вероятно, лучше просто оставить это на данный момент.

Комментарии:

1. Спасибо! Это изменение устранило мою проблему.

2. К сожалению, это код, который я изначально написал — мой чрезмерно амбициозный проект «Hello world». Если вы чувствуете себя особенно полезным для этого новичка в Python, не могли бы вы предложить (или ссылку на) более правильный способ сделать это?

3. @Nstr10: используйте обычный for цикл.