首页 > 技术文章 > 生成器版本的文件MD5校验

dachenzi 2017-05-02 23:04 原文

生成器是一个可迭代的对象,可以对可迭代的对象进行便利,比如字符串、列表等,都是可迭代对象
 
 def f(n):
  for i in range(n):
    yield i
 
特点:
  1、当调用这个函数的时候,函数内部的代码并不立马执行,这个函数只是返回一个生成器对象
  2、当使用for进行迭代的时候,函数内的代码才会被执行
 
yield与return的区别:
  1、return的时候这个函数的局部变量就都销毁了
  2、所有return是得到所有结果之后的返回
  3、yield是产生一个可以恢复的函数(生成器),恢复了局部变量
  4、生成器只有在调用next()时才运行函数生成一个结果
  5、return 不能出现在生成器中
 
yield版本的MD5:
 1 #!/usr/bin/env python
 2  
 3 import os
 4 import sys
 5 import hashlib
 6  
 7 def md5sum(f):
 8     m = hashlib.md5()
 9     with open(f) as fd:
10         while True:
11             data = fd.read(4096)
12             if data:
13                 m.update(data)
14             else:
15                 break
16 return m.hexdigest()
17  
18 def file_md5(dirpath):
19     pathobj = os.walk(dirpath)
20     for roots,dirs,files in pathobj:
21         for file in files:
22             filename = os.path.join(roots,file)
23             md5 = md5sum(filename)
24             yield "%s %s" % ( md5,filename)
25  
26 def main():
27     try:
28         dirpath = sys.argv[1]
29     except IndexError as e:
30         sys.exit('need one dirctory')
31     if os.path.isfile(dirpath):
32         sys.exit('Please input a directory')
33     for info in file_md5(dirpath):
34         print info
35  
36  
37 if __name__ == '__main__':
38     main()                                                

 

 
 
 

推荐阅读