赞
踩
本爪爪熊在一个朋友的帮助下,成功的下载到了数以万计的文件在同一个目录下。这其中就带来了一个问题,这些文件中很多都是重复的,如何快速的去除这些重复的文件呢?
这里使用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()
目前我仅仅测试了一个目录,我朋友使用反馈的时候多个目录也是可以的,关于是否可以,就要自己试试了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。