这是我写的通过效验文件抽样MD5和文件大小的程序,稍微改了改,给你用吧。
代码:import hashlib
from os import walk as os_walk
from os import sep,remove
from os.path import getsize,expanduser
from os.path import join as os_join
import easygui
class Delete_Repeat_File:
def __init__(self,sign=1):
self.sign = sign
# 所有遍历到的文件(不包括重复文件)
self.all_file = {}
# 所有重复文件
self.all_repeat_file = []
def main(self):
# 刷新主窗口
while True:
file = easygui.diropenbox(f'线程{self.sign}:请选择将要清理的文件夹。')
# 返回-1表示取消操作
if file == -1:
return '操作被取消!'
# 集合目录
_dir = []
_dir.extend(file)
# 如果所选文件里没有目录
if not _dir:
print(f'线程{self.sign}:未指定任何文件目录!')
continue
break
# 启动筛选程序
return self.start(_dir)
# 获取文件MD5
def get_file_md5(self,file_path):
with open(file_path, 'rb') as file:
for each_time in range(3000):
data = file.read(1024) #将文件分块读取
if not data:
break
self.md5.update(data)
return self.md5.hexdigest()
# 比对MD5
def compare_md5(self,file_path):
self.md5 = hashlib.md5()
file_md5 = self.get_file_md5(file_path)
file_size = str(getsize(file_path))
# 提取相同的文件
repeat_file = self.all_file.get(file_md5+file_size)
# 如果提取到了相同的文件
if repeat_file:
# 刷新主窗口
self.ui.thread_show(str(self.all_file[file_md5+file_size])+','+str(file_path)+'\n')
# 将两个文件的路径写入txt
with open(os_join(expanduser('~'),'Desktop\\重复的文件.txt'),'at',encoding='utf8') as result_file:
result_file.write(str(self.all_file[file_md5+file_size])+','+str(file_path)+'\n')
# 记录重复的文件的路径
self.all_repeat_file.append(file_path)
# 如果没有提取到相同的文件
else:
# 记录非重复文件的路径
self.all_file[file_md5+file_size] = file_path
def start(self,dirs):
# 刷新主窗口
print(f'线程{self.sign}:正在清理重复文件中。。。')
# 刷新主窗口
print(f'线程{self.sign}:开始清理重复文件!')
# 删除旧的txt
try:remove(os_join(expanduser('~'),'Desktop\\重复的文件.txt'))
except:pass
# 开始效验文件
for each_dir in dirs:
for each_path in os_walk(each_dir):
for each_file in each_path[2]:
self.compare_md5(each_path[0]+sep+each_file)
del self.md5
# 清理内存
del self.all_file
# 如果找到了重复的文件
if len(self.all_repeat_file):
while True:
# 请求回复
response = input(f'线程{self.sign}:发现{len(self.all_repeat_file)}个重复的文件,是否删除?【Y\\N】【详情请查看‘桌面\重复的文件.txt】')
# 删除重复的文件
if response.casefold() == 'y':
for each_path in self.all_repeat_file:
remove(each_path)
return '重复文件清除完成!'
# 操作被取消
elif response.casefold() == 'n':
return '操作被取消!'
# 返回了错误的输入
else:
self.ui.ai_show(f'线程{self.sign}:输入数据错误!')
else:
return '没有发现重复的文件!'
def main(args,sign=1):
exec(f'deleter{sign} = Delete_Repeat_File(sign)')
return eval(f'deleter{sign}.main()')
if __name__ == '__main__':
deleter = Delete_Repeat_File()
deleter.main()
|