使用Python计算文件MD5值以查找重复文件

阿麦
阿麦
发布时间:2026-10-11| 3人浏览过
原创

本文介绍如何利用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模块及自动化脚本的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。