生活随笔
收集整理的這篇文章主要介紹了
Python实现文件md5校验
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Linux下校驗文件MD5值,最簡單的方法就是執行md5sum命令
md5sum filename
原本打算用subprocess調用系統命令來獲取md5值,
[python]?view plaincopy print?
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 plaincopy print?
?? ?? 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 plaincopy print?
?? ?? ??? ???? ??def?md5hex(word):?? ?????? ??? ?????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):?? ?????? ?? ?????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() ?
總結
以上是生活随笔為你收集整理的Python实现文件md5校验的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。