Python的学习(三十) ---- Python实现文件md5校验

来源:互联网 发布:淘宝网店卖衣服 编辑:程序博客网 时间:2024/05/29 05:10

Linux下校验文件MD5值,最简单的方法就是执行md5sum命令
md5sum filename
原本打算用subprocess调用系统命令来获取md5值,

import subprocess,shlexcmd = "md5sum filename"p = subprocess(shlex.split(cmd), stdout=subprocess.PIPE)print p.stdout.read()

不过python有自带的MD5模块hashlib,用起来简单很多,
Python Hashlib模块的使用说明 http://docs.python.org/2/library/hashlib.html
fd = hashlib.md5() #获取一个MD5加密算法对象
fd.update("string") #指定需要加密的字符串
fd.hexdigest() #获取加密后的16进制字符串

实例

 #!/usr/bin/env python            #coding : utf-8 3  4 import sys  import hashlib                                                    def md5sum(filename):                fd = open(filename,"r")     fcont = fd.r     fd.close()              fmd5 = hashlib.md5(fcont)     return fmd5                                               if __name__ == "__main__":           fmd5 = md5sum(sys.argv[1])     print fmd5.hexdigest()  

其中fmd5 = hashlib.md5(fcont)等同于
fmd5 = hashlib.md5(fcont)
fmd5.update(fcont)

需要注意的是,传入 hashlib.md5() 的应该是 文件内容而不是文件名 ,这样才是对文件内容产生md5校验码;
另外,调用了 hashlib.md5() 后返回的是一个对象,想要获得linux下 md5sum 同样的效果,还要调用一下 hexdigest() 方法。

但是,这个方法有点过于粗暴,当检验大文件时,一次将所有文件内容读入内存,实在耗费较大,
网上给出实例http://blog.csdn.net/shanliangliuxing/article/details/10115397,
根据文件块长度,依次获取文件内容读入内存,通过update()逐次更新校验值,

#!/usr/bin/env python 2 #coding : utf-8 3 import hashlib    def md5hex(word):     """ MD5加密算法,返回32位小写16进制符号     """      if isinstance(word, unicode):         word = word.encode("utf-8")     elif not isinstance(word, str):         word = str(word)     m = hashlib.md5()     m.update(word)     return m.hexdigest()   def md5sum(fname):     """ 计算文件的MD5值     """     def read_chunks(fh):         fh.seek(0)         chunk = fh.read(8096)         while chunk:             yield chunk             chunk = fh.read(8096)         else: #最后要将游标放回文件开头             fh.seek(0)     m = hashlib.md5()     if isinstance(fname, basestring) \             and os.path.exists(fname):         with open(fname, "rb") as fh:             for chunk in read_chunks(fh):                 m.update(chunk)     #上传的文件缓存 或 已打开的文件流     elif fname.__class__.__name__ in ["StringIO", "StringO"] \             or isinstance(fname, file):         for chunk in read_chunks(fname):             m.update(chunk)     else:         return ""40     return m.hexdigest()

 

1 0
原创粉丝点击