Python 根据MD5判断相同文件
import hashlib
import os
import send2trash
import time
'''
根据MD5,查找一个目录下的相同文件,并且可以选择是否删除(只是删除到回收站)
'''
def getMD5(path):
f=open(path,'rb')
d5 = hashlib.md5() #生成一个hash的对象
with open(path,'rb') as f:
while True:
content = f.read(40960)
if not content:
break
d5.update(content) # 每次读取一部分,然后添加到hash对象里
# print('MD5 : %s' % d5.hexdigest())
return d5.hexdigest() # 打印16进制的hash值
def getSha512(path):
f = open(path, 'rb')
sh = hashlib.sha512()
with open(path,'rb') as f:
while True:
content = f.read(40960)
if not content:
break
sh.update(content)
# print(sh.hexdigest())
return sh.hexdigest()
# 装饰器,计算时间用的
def timer(func): # 高阶函数:以函数作为参数
def deco(*args,**kwargs): # 嵌套函数,在函数内部以 def 声明一个函数,接受 被装饰函数的所有参数
time1 = time.time()
func(*args,**kwargs)
time2 = time.time()
use_time = round(time2-time1,1)
print('Elapsed %ss' %(use_time))
return deco # 注意,返回的函数没有加括号!所以返回的是一个内存地址,而不是函数的返回值
@timer
def walk(path):
size = 0
x = input('Want to delete duplicate file? y/n\n')
if x.lower() == 'y':
delete = True
else:
delete = False
dict = {}
n = 1
for folder,subfolder,filenames in os.walk(path):
for filename in filenames:
print('\rHas scanned %s files' %n,end='')
root = os.path.join(folder,filename)
md5 = getMD5(root)
if md5 in dict.keys():
# sha1 = getSha512(root)
# sha2 = getSha512(dict[md5])
# if sha1 == sha2:
# 发送到回收站
if delete == True:
send2trash.send2trash(dict[md5])
print('\n%s\n%s\n' %(root,dict[md5]))
# 获取文件大小
fsize = os.path.getsize(root)
size += fsize
else:
pass
dict[md5] = root
n += 1
# 处理文件大小的单位 M
size = size/float(1024*1024)
size = round(size,2)
if delete == True:
print('\nSaved %sM space.' % size)
else:
print("\nWasted %sM sapce." %size)
if __name__ =="__main__":
x = input('Input path:')
walk(x)
分类:
Python Scripts
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构