iter()

iter 妙用

refs: https://www.geeksforgeeks.org/python-iter-method/

今天在对文件进行 md5 生成时,考虑到大文件,需要分块读取,查询相关资料后,iter() 方法可以很巧妙的实现

iter 用法

  • iter(object[, sentinel])

  • 当第二个参数不存在, 第一个参数必须是支持迭代协议的容器类型对象,例如字典等, 或者是支持序列协议的序列类型对象,例如列表等,如果都不支持则报错。

  • 当第二个参数存在, 即哨兵参数存在,则第一个参数必须是可调用对象,即函数等,以此种方式创建的迭代器对象将会调用object,可调用对象参数调用时不需要参数,如果可调用对象调用后返回值与哨兵对象值相同, 则会引发 stopiteration ,调用结束。

使用示例:

sentinel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import random
from collections import Iterator

def get_number():
"""随机生成1-10的整数"""

num=random.randint(1,5)
print(f"The random number is {num}")
return num


random_number=iter(get_number,5)
print(isinstance(random_number,Iterator))

for i in random_number:
print(f"get number: {i}")

-->
True
The random number is 2
get number: 2
The random number is 3
get number: 3
The random number is 5

分块读取文件

当读取到 b'' 时,表示文件读取完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import hashlib

def file_md5(file_path):
"""
get file md5 checksum
:param file_path:
:return:
"""
hash_md5 = hashlib.md5()
with open(file_path, 'rb') as f:
for chunk in iter(lambda: f.read(1024), b''):
print(chunk)
hash_md5.update(chunk)
return hash_md5.hexdigest()
-------------THANKS FOR READING-------------