Linux下校验文件MD5值,最简单的方法就是执行md5sum命令
md5sum filename
原本打算用subprocess调用系统命令来获取md5值,
[python] view plain copy
- import subprocess,shlex
- cmd = "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进制字符串
实例
[python] view plain copy
- #!/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()逐次更新校验值,
[python] view plain copy
- #!/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()