当前位置:   article > 正文

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

删除命中文件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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/340126
推荐阅读
相关标签
  

闽ICP备14008679号