python检测文件的MD5值
MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。MD5算法的使用不需要支付任何版权费用。     

      每个文件都会有一个MD5的加密值,这个值来唯一标识这个文件,它常用来辨别文件的真伪,例如下载系统安装镜像,旁边会附带一个长长的字符乱码,这就是这个镜像的MD5值。文件被修改后其MD5值也会改变,所以可以用来判断一个文件是否被修改过。这样的方法比基于时间、文件大小的比较显然更加可靠。


感谢大神之作:

#!/usr/bin/env python
#coding: utf-8
import re
import os
import shutil
import time
import random
import sys
import urllib
import hashlib
#重复邮件的目录
FROM_FOLDER_LIST=["/data/zhangsan/cur",]
#准确的,即去重后的需要的邮件
TARGET_FOLDER="/root/patch1"
#得到的重复邮件
TARGET_FOLDER2="/root/patch3"
def get_md5_value(src):
        #调用hashlib里的md5()生成一个md5 hash对象
        myMd5 = hashlib.md5()
        #生成hash对象后,就可以用update方法对字符串进行md5加密的更新处理
        myMd5.update(src)
        #加密后的十六进制结果
        myMd5_Digest = myMd5.hexdigest()
        #返回十六进制结果
        return myMd5_Digest
MD5_POOL={
}
for FROM_FOLDER in FROM_FOLDER_LIST:
        for root, dirs, files in os.walk(FROM_FOLDER):
                for file_name in files:
                        filepath = "%s/%s"%(root,file_name)
                        print "扫描文件  ",filepath
                        #以上几行是循环扫描每个文件,并打印出来
                        try:
                                #打开一个文件,并定义为fobj别名
                                with open(filepath,"rb") as fobj:
                                        #读文件
                                        code = fobj.read()
                                #调用获取md5值的函数,返回文件的十六进制结果,并赋值给md5_v变量
                                md5_v = get_md5_value(code)
                                #假如md5_v没在MD5_POOL池(字典)中,然后打印出来,并移动到TARGET_FOLDER目录
                                if not md5_v in MD5_POOL:
                                        print "移动文件 %s 到目录 %s下"%(filepath,TARGET_FOLDER)
                                        shutil.move(filepath, "%s/%s"%(TARGET_FOLDER,file_name))
                                        #然后加到池中,一个是key,一个是值
                                        MD5_POOL[md5_v] = file_name
                                else:
                                        #假如池中,就重复了,就移动到TARGET_FOLDER2目录
                                        print "%s 是重复文件, 移动到目录 %s下"%(filepath,TARGET_FOLDER2)
                                        shutil.move(filepath, "%s/%s"%(TARGET_FOLDER2,file_name))
                        except Exception,err:
                                print err
                                print "copy file %s error"%filepath
                                continue