#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
цикл.