python文件拷贝并校验_Python札记 -- 文件校验
好久沒有寫隨筆了,正好這兩天可以休整一下,借此機會總結下最近使用python的小體會。
個人體會文件校驗在下載文件時使用較多,在linux下最簡單的實現方式就是:
1 $ md5sum filename2 21c7ee192e64569ce43cfb869bdb2755 filename
當然在python當中也有對應的模塊可以實現此功能,在python2.5之前可以使用 md5 模塊,但是在python2.5以后就推薦使用 hashlib 來代替 md5 模塊了。最簡單的實現代碼如下:
1 #!/usr/bin/env python
2 #coding : utf-8
3
4 importsys5 importhashlib6
7 defmd5sum(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 returnfile_md513
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 importhashlib, os4
5 defmd5hex(word):6 """MD5加密算法,返回32位小寫16進制符號7 """
8 ifisinstance(word, unicode):9 word = word.encode("utf-8")10 elif notisinstance(word, str):11 word =str(word)12 m =hashlib.md5()13 m.update(word)14 returnm.hexdigest()15
16 defmd5sum(fname):17 """計算文件的MD5值18 """
19 defread_chunks(fh):20 fh.seek(0)21 chunk = fh.read(8096)22 whilechunk:23 yieldchunk24 chunk = fh.read(8096)25 else: #最后要將游標放回文件開頭
26 fh.seek(0)27 m =hashlib.md5()28 ifisinstance(fname, basestring) \29 andos.path.exists(fname):30 with open(fname, "rb") as fh:31 for chunk inread_chunks(fh):32 m.update(chunk)33 #上傳的文件緩存 或 已打開的文件流
34 elif fname.__class__.__name__ in ["StringIO", "StringO"] \35 orisinstance(fname, file):36 for chunk inread_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
總結
以上是生活随笔為你收集整理的python文件拷贝并校验_Python札记 -- 文件校验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年山东最新交安安全员考试模拟题及
- 下一篇: FinTech头条丨神州信息分布式核心助