-2

生成文件的 MD5 校验和

我使用了上述链接中的一个示例,但通过删除对函数的调用(最初来自上面)对其进行了一些小改动:

import hashlib
hash = hashlib.md5()
with open('validFilePath/file.xxx', "r+b") as f:
    for block in iter(lambda: f.read(65536), ""):
        hash.update(block)
return hash.hexdigest()

这给了我以下错误。

File "<string>", line 4, in <module>
TypeError: 'function' object is not iterable

我错过了一些基本的 Python 前提吗?

4

2 回答 2

2

几乎可以肯定缺少该iter()函数的第二个参数。

如果没有第二个参数,第一个参数必须是可迭代的,但 alambda会产生一个函数,而这不是可迭代的:

>>> iter(lambda: f.read(65536))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'function' object is not iterable

iter()文档中:

根据第二个参数的存在,第一个参数的解释非常不同。如果没有第二个参数,o必须是支持迭代协议(__iter__()方法)的集合对象,或者它必须支持序列协议(__getitem__()整数参数从 开始的方法0)。如果它不支持这些协议中的任何一个,TypeError则会引发。

使用第二个参数,您可以获得一个适当的迭代器,用于for循环迭代:

>>> iter(lambda: f.read(65536), '')
<callable-iterator object at 0x100563150>

每次迭代都会调用 lambda 函数,直到该函数返回''空字符串。换句话说,每次迭代都会读取 64Kb,直到到达文件末尾,此时f.read()操作返回一个空字符串并且迭代器 raise StopIteration

于 2015-04-29T21:36:27.677 回答
-1

谢谢...在马丁斯的帮助下想通了。感谢您指出错误的原因。由于某种原因,它不喜欢 iter 函数的第二个参数中提供的双引号。我将它们更改为单引号,该功能现在可以使用。

-基思

于 2015-04-29T21:56:35.553 回答