我一直在将一组Python 2.7脚本移植到Python 3.5,以便我可以使用2.7中不可用的一些库,但我从以前工作的代码中获得MemoryError:
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哈希的正确方法。我似乎找不到任何关于这个问题的资料。如果有帮助,下面是在shell中运行上述代码时的回溯:
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in <listcomp>
也尝试替换
sha2h = hashlib.sha256()
sha2h = hashlib.new('sha256')
来匹配hashlib的文档,但是结果没有变化。
任何帮助或见解将不胜感激!
在Python 3上,您需要将b''
而不是''
设置为iter
调用的哨兵值:
iter(functools.partial(f.read, 256), b'')
对于这样的副作用,你也不应该使用列表推导式,但是如果你移植的是已经存在的代码,那么现在最好还是不要使用它。