使用Python计算文件MD5值以查找重复文件
本文介绍如何利用Python的hashlib模块计算文件的MD5值,进而识别目录下的重复文件。文章提供了命令行快速检测方法及完整的Python脚本实现,包含逐块读取大文件的优化方案,并演示如何生成重复文件日志。
利用MD5值检测重复文件
MD5(Message-Digest Algorithm 5)是一种广泛使用的密码散列函数,可产生一个128位(16字节)的哈希值。在文件管理中,通过计算文件的MD5值,可以高效地识别内容完全相同的重复文件。即使文件名不同或修改了文件名,只要文件内容未变,其MD5值依然保持一致。这种方法常用于清理冗余数据或检测学生作业抄袭行为。
命令行快速计算MD5
对于单个文件的快速校验,可以直接使用Python的一行命令。以下示例展示了如何计算指定文件的MD5、SHA1、SHA256及SHA512哈希值:
python -c "import hashlib,sys;print hashlib.md5(open(sys.argv[1],'rb').read()).hexdigest()" 文件名类似地,可以替换为其他哈希算法:
python -c "import hashlib,sys;print hashlib.sha1(open(sys.argv[1],'rb').read()).hexdigest()" 文件名python -c "import hashlib,sys;print hashlib.sha256(open(sys.argv[1],'rb').read()).hexdigest()" 文件名python -c "import hashlib,sys;print hashlib.sha512(open(sys.argv[1],'rb').read()).hexdigest()" 文件名
Python脚本实现批量查找
为了处理大量文件,我们需要编写一个Python脚本来遍历目录、计算每个文件的MD5值,并找出重复项。以下是完整的实现代码:
# coding: utf8
import hashlib
import os
from collections import Counter
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def get_md5_01(file_path):
md5 = None
if os.path.isfile(file_path):
f = open(file_path,'rb')
md5_obj = hashlib.md5()
md5_obj.update(f.read())
hash_code = md5_obj.hexdigest()
f.close()
md5 = str(hash_code).lower()
return md5
def get_md5_02(file_path):
f = open(file_path,'rb')
md5_obj = hashlib.md5()
while True:
d = f.read(8096)
if not d:
break
md5_obj.update(d)
hash_code = md5_obj.hexdigest()
f.close()
md5 = str(hash_code).lower()
return md5
if __name__ == "__main__":
output_list=[]
#input_path=r"e:\xx\新建文件夹"
#output_path = unicode(input_path , "utf8")
output_path=os.getcwd()
g = os.walk(output_path)
for path,dir_list,file_list in g:
for file_name in file_list:
output_list.append(os.path.join(path, file_name) )
md5_list= [get_md5_01(i) for i in output_list]
Counter_list=Counter(md5_list)
for i in Counter_list.items():
if i[1] >1:
duplicate_list=[ a for a in range(len(md5_list)) if md5_list[a] == i[0]]
print '-'*50
print i[0]
for j in duplicate_list:
with open('duplicate.log', mode='a+') as f:
f.write(i[0]+'\t'+output_list[j]+'\n')
print output_list[j]代码逻辑解析
脚本主要包含两个计算MD5的函数:get_md5_01和get_md5_02。get_md5_01一次性读取整个文件内容,适用于小文件。而get_md5_02采用分块读取的方式,每次读取8096字节,这种方式在处理大文件时能显著降低内存占用,避免内存溢出。
在__main__部分,脚本首先获取当前工作目录(os.getcwd()),并通过os.walk()递归遍历所有子目录。它将所有文件路径收集到output_list中,然后计算每个文件的MD5值并存入md5_list。
接着,利用collections.Counter统计每个MD5值出现的次数。如果某个MD5值出现次数大于1,说明存在重复文件。脚本会打印出重复文件的MD5值和具体路径,并将结果追加写入到duplicate.log文件中。
注意事项
- 确保文件以二进制模式(
'rb')打开,以保证MD5计算的一致性。 - 对于大文件,建议使用
get_md5_02函数,以避免内存不足。 - 脚本默认在当前工作目录下运行,可通过修改
output_path变量指定其他目录。
以上就是使用Python计算文件MD5值以查找重复文件的详细内容,更多关于Python文件处理、hashlib模块及自动化脚本的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









