Python札记 -- 文件校验

    好久没有写随笔了,正好这两天可以休整一下,借此机会总结下最近使用python的小体会。

    个人体会文件校验在下载文件时使用较多,在linux下最简单的实现方式就是:

1 $ md5sum filename
2 21c7ee192e64569ce43cfb869bdb2755  filename

     当然在python当中也有对应的模块可以实现此功能,在python2.5之前可以使用 md5 模块,但是在python2.5以后就推荐使用 hashlib 来代替 md5 模块了。最简单的实现代码如下:

 1 #!/usr/bin/env python
 2 #coding : utf-8
 3 
 4 import sys
 5 import hashlib
 6 
 7 def md5sum(filename):
 8     file_object = open(filename, 'rb')
 9     file_content = file_object.read()
10     file_object.close()
11     file_md5 = hashlib.md5(file_content)
12     return file_md5
13 
14 if __name__ == "__main__":
15     file_md5 = md5sum(sys.argv[1])
16     print file_md5.hexdigest()

    竹风觉得有两个地方值得注意:
    一个是传入 hashlib.md5() 的应该是 file_object.read() ,这样才是对文件内容产生md5校验码,竹风刚开始就是没有使用 read() 方法,而是传入filename(这样的md5是对文件名生成的),导致产生的校验码不对;
    另外一个地方是,调用了 hashlib.md5() 后返回的是一个对象,想要获得 linux 下 md5sum 同样的效果,还要调用一下 hexdigest() 方法。

    当然,上面的代码考虑得不够周全。如果要对一个比较大的文件进行校验,将会把文件内容一次读入内存,造成性能上的缺陷。个人比较推荐从http://ryan-liu.iteye.com/blog/1530029提供的代码,代码如下:

 1 #!/usr/bin/env python
 2 #coding : utf-8
 3 import hashlib, os
4 5 def md5hex(word): 6 """ MD5加密算法,返回32位小写16进制符号 7 """ 8 if isinstance(word, unicode): 9 word = word.encode("utf-8") 10 elif not isinstance(word, str): 11 word = str(word) 12 m = hashlib.md5() 13 m.update(word) 14 return m.hexdigest() 15 16 def md5sum(fname): 17 """ 计算文件的MD5值 18 """ 19 def read_chunks(fh): 20 fh.seek(0) 21 chunk = fh.read(8096) 22 while chunk: 23 yield chunk 24 chunk = fh.read(8096) 25 else: #最后要将游标放回文件开头 26 fh.seek(0) 27 m = hashlib.md5() 28 if isinstance(fname, basestring) \ 29 and os.path.exists(fname): 30 with open(fname, "rb") as fh: 31 for chunk in read_chunks(fh): 32 m.update(chunk) 33 #上传的文件缓存 或 已打开的文件流 34 elif fname.__class__.__name__ in ["StringIO", "StringO"] \ 35 or isinstance(fname, file): 36 for chunk in read_chunks(fname): 37 m.update(chunk) 38 else: 39 return "" 40 return m.hexdigest()

这段代码就足够强大了,每次读入8k的内容,然后调用 update() ,来更新md5。
PS:至于为什么是8k?这个就涉及到了IO大小方面的内容了。提供一篇文章,有兴趣的可以看看了解下:http://blog.sina.com.cn/s/blog_6200c1440100vt4z.html

 

posted @ 2013-05-10 15:42  竹风抚荷塘  阅读(2246)  评论(0编辑  收藏  举报