怎么用Python制作一个文件去重小工具
这篇文章主要讲解了“怎么用Python制作一个文件去重小工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python制作一个文件去重小工具”吧!
前言常常在下载网络素材时有很多的重复文件乱七八糟的,于是想实现一个去重的操作。
主要实现思路就是遍历出某个文件夹包括其子文件夹下面的所有文件,最后,将所有文件通过MD5函数的对比筛选出来,最后将重复的文件移除。
实现步骤用到的第三方库都比较的常见,其中只有hashlib是用来对比文件的不是很常见。其他的都是一些比较常见的第三方库用来做辅助操作。
importos#应用文件操作importhashlib#文件对比操作importlogging#日志函数操作importsys#系统应用操作
日志的设置基本都是这一套的范式,按照规则设置好日志打印的相关信息。
logger=logging.getLogger('系统文件去重')logging.basicConfig(format='%(asctime)s%(levelname)-8s:%(message)s')logger.setLevel(logging.DEBUG)
文件去重的实现逻辑代码块如下:
diretory=input('请输入需要整理的文件目录:\n')#去重的文件夹路径ifos.path.isdir(diretory):logger.info('当前目录['+diretory+']校验成功!')md5s=[]forfile_path,dir_names,file_namesinos.walk(r''+diretory):forfile_nameinfile_names:try:file_name_path=os.path.join(file_path,file_name)logger.info('当前比对路径:'+file_name_path)md5=hashlib.md5()file=open(file_name_path,"rb")md5.update(file.read())file.close()md5_value=md5.hexdigest()ifmd5_valueinmd5s:os.remove(file_name_path)logger.info('['+file_name_path+']出现重复已经移除!')else:md5s.append(md5_value)except:logger.error('['+file_name_path+']对比发生异常,执行下一个!')else:logger.error('输入的文件夹或者目录不存在!')
以上就是文件去重的整个实现过程,用来做一个清理电脑文件的小工具还是比较实用的。
补充本文中主要是利用hashlib.md5()函数实现的,下面小编为大家重点介绍一下hashlib.md5()
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。 举个例子,你写了一篇文章,内容是一个字符串'how to use python hashlib - by Michael',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,并发表为'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因为根据'how to use python hashlib - by Bob'计算出的摘要不同于原始文章的摘要。
可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
当然,hashlib.md5()除了可以用来给文件去重,还能做到密码加密,下面是示例代码
#!/usr/bin/envpython#-*-coding:utf-8-*-"""功能:登录验证模块详细说明:1.密码文件为passwd2.passwd未创建或丢失,会提示:密码文件不存在,建议重新注册!!3.未注册用户登录会提示:用户名不存在,请您先进行注册!4.已注册用户登录时,忘记密码,尝试3次后密码还不正确则退出验证,等一会儿则可以重新登录5.作为装饰器进行登录验证"""importjsonimporthashlibimportospwd=os.getcwd()fileName=os.path.join(pwd,"passwd")#将明文密码通过md5进行加密,返回一个加密后的md5的值defcalc_md5(passwd):md5=hashlib.md5("haliluya")md5.update(passwd)ret=md5.hexdigest()returnret#新用户注册模块defregister():#判断密码文件passwd是否存在,存在则载入列表,不存在就重新创建一个空字典ifos.path.exists(fileName):#载入用户列表,数据结构为字典,k=userName,v=passwdMd5withopen("passwd","r+")asloadsFn:userDB=json.loads(loadsFn.read())else:userDB={}#让用户输入用户名userName=raw_input("姓名:")#标志位:控制循环跳出flag=Truewhileflag:#用户注册时,需输入两次密码passwd1=raw_input("密码:")passwd2=raw_input("确认密码:")#如果两次密码不一致,则不执行下一步,再次输入密码并进行确认ifnotpasswd1==passwd2:continueelse:#两次输入密码一致,标志位置为False,下次跳出循环flag=False#调用calc_md5函数将明文密码转为对应的md5值,用于保存passwdMd5=calc_md5(passwd1)#将用户名与密码对应存入字典userDB中userDB[userName]=passwdMd5#将用户名和密码存入文件withopen(fileName,"w")asdumpFn:dumpFn.write(json.dumps(userDB))#用户登录验证,装饰器deflogin(func):defdecorater(*args,**kwargs):#判断passwd文件是否存在,存在则载入userDB(用户:密码),否则就重新注册新的passwd文件并返回ifos.path.exists(fileName):withopen("passwd","r+")asloadsFn:userDB=json.loads(loadsFn.read())else:print"密码文件不存在,建议重新注册!!"register()returnname=raw_input("用户名:")#用户名是否存在,存在就继续输入密码,不存在则进行注册ifnameinuserDB.keys():flag=Truecounter=0#循环输入密码,密码正确,flag=False(下次直接跳出循环)并执行函数,密码错误则允许尝试3次,超过3次验证失败,退出验证whileflag:passwd=raw_input("密码:")passwdMd5=calc_md5(passwd)ifpasswdMd5==userDB[name]:flag=Falsefunc(*args,**kwargs)elifcounter>2:print"您已经尝试了3次,请过会儿再试!!"returnelse:counter+=1else:print"用户名不存在,请您先进行注册!"register()returndecoraterif__name__=="__main__":@logindefhello():print"Helloworld!"hello()
感谢各位的阅读,以上就是“怎么用Python制作一个文件去重小工具”的内容了,经过本文的学习后,相信大家对怎么用Python制作一个文件去重小工具这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。