python 通过md5检查并删除重复文件

注意:本操作具备危险性,使用代码删除文件之前请保留一份备份,以备不时之需。

本爪爪熊在一个朋友的帮助下,成功的下载到了数以万计的文件在同一个目录下。这其中就带来了一个问题,这些文件中很多都是重复的,如何快速的去除这些重复的文件呢?
  这里使用md5校验的办法,通过python进行实现,最终重复的文件仅会保留一份。
  废话不多说,直接上代码:

  #! /usr/bin/python3
# -*- coding:utf-8 -*-
# @Time    : 8/21/2020 2:41 PM
# @Author  : jet li
# @Email   : robo_jet@qq.com
# @File    : md5_check.py
# @SoftWare: PyCharm
import os
import hashlib
from tqdm import tqdm


def get_md5(file_path):
    if not os.path.isfile(file_path):
        return
    file_hash = hashlib.md5()
    f = open(file_path, 'rb')
    while True:
        b = f.read(8096)
        if not b:
            break
        file_hash.update(b)
    f.close()
    return file_hash.hexdigest()


class Md5Delete(object):
    """
    删除同目录下md5相同的文件。
    """
    def __init__(self, dir_path):
        self.dir_path = dir_path
        self.file_path_md5 = {}

    def check_md5(self):
        dir_path = self.dir_path
        for root, dirs, files in tqdm(os.walk(dir_path)):
            # print('root:', root)
            for i in tqdm(range(len(files))):
                file_path = os.path.join(root, files[i])
                file_md5 = get_md5(file_path)
                self.file_path_md5[file_path] = file_md5
                # print(file_md5)

    def judge_md5_delete(self):
        length = len(self.file_path_md5)
        i, j = 0, 0
        is_delete = 0
        pbar = tqdm(total=length)
        new_file_path_md5_list = list(self.file_path_md5)
        while True:
            pbar.update(1)
            is_delete = 0
            j = 0
            if i >= length:
                break
            first_file_md5 = self.file_path_md5[new_file_path_md5_list[i]]
            first_file_path = new_file_path_md5_list[i]
            for j in range(length):
                if j >= length:
                    break
                if j <= i:
                    continue
                second_file_md5 = self.file_path_md5[new_file_path_md5_list[j]]
                second_file_path = new_file_path_md5_list[j]

                if first_file_md5 == second_file_md5:
                    self.file_path_md5.pop(second_file_path)
                    # 删除了需要重新生成list
                    new_file_path_md5_list = list(self.file_path_md5)
                    is_delete = 1
                    length = len(self.file_path_md5)
                    os.remove(second_file_path)
                else:
                    j += 1
            if is_delete == 0:
                i += 1
        pbar.close()
        pass

    def run(self):
        self.check_md5()
        self.judge_md5_delete()


def run():
    mmd5 = Md5Delete(r"E:\Z_软件缓存\有重复的文件夹\list0")
    mmd5.run()
    pass


if __name__ == '__main__':
    run()

目前我仅仅测试了一个目录,我朋友使用反馈的时候多个目录也是可以的,关于是否可以,就要自己试试了。

注意:提前备份再尝试脚本

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值