【问题标题】:Hashlib MemoryError in Python 3.5 but not in 2.7Python 3.5 中的 Hashlib MemoryError 但 2.7 中没有
【发布时间】:2016-10-12 17:37:44
【问题描述】:

我一直在将一组 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 python-3.x hashlib functools


    【解决方案1】:

    在 Python 3 上,您需要将 b'' 而不是 '' 设置为 iter 调用的标记值:

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

    您也确实不应该对这样的副作用使用列表推导,但如果您要移植执行此操作的现有代码,最好暂时保留它。

    【讨论】:

    • 谢谢!此更改解决了我的问题。
    • 尴尬的是,这是我最初编写的代码——我过于雄心勃勃的“Hello world”项目。如果您对这个 Python 新手更有帮助,您能否建议(或链接到)更合适的方法?
    • @Nstr10:使用普通的for 循环。
    猜你喜欢
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2013-12-21
    • 2016-05-11
    相关资源
    最近更新 更多