目录
前言实现步骤补充前言
常常在下载网络素材时有很多的重复文件乱七八糟的,于是想实现一个去重的操作。
主要实现思路就是遍历出某个文件夹包括其子文件夹下面的所有文件,最后,将所有文件通过MD5函数的对比筛选出来,最后将重复的文件移除。
实现步骤
用到的第三方库都比较的常见,其中只有hashlib是用来对比文件的不是很常见。其他的都是一些比较常见的第三方库用来做辅助操作。
import os # 应用文件操作 import hashlib # 文件对比操作 import logging # 日志函数操作 import sys # 系统应用操作
日志的设置基本都是这一套的范式,按照规则设置好日志打印的相关信息。
logger = logging.getLogger("系统文件去重") logging.basicConfig(format="%(asctime)s %(levelname)-8s: %(message)s") logger.setLevel(logging.DEBUG)
文件去重的实现逻辑代码块如下:
diretory = input("请输入需要整理的文件目录: \n") # 去重的文件夹路径 if os.path.isdir(diretory): logger.info("当前目录[" + diretory + "]校验成功!") md5s = [] for file_path, dir_names, file_names in os.walk(r"" + diretory): for file_name in file_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() if md5_value in md5s: 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/env python #-*- coding:utf-8 -*- """ 功能: 登录验证模块 详细说明: 1.密码文件为passwd 2.passwd未创建或丢失,会提示:密码文件不存在,建议重新注册!! 3.未注册用户登录会提示:用户名不存在,请您先进行注册! 4.已注册用户登录时,忘记密码,尝试3次后密码还不正确则退出验证,等一会儿则可以重新登录 5.作为装饰器进行登录验证 """ import json import hashlib import os pwd = os.getcwd() fileName = os.path.join(pwd,"passwd") #将明文密码通过md5进行加密,返回一个加密后的md5的值 def calc_md5(passwd): md5 = hashlib.md5("haliluya") md5.update(passwd) ret = md5.hexdigest() return ret #新用户注册模块 def register(): #判断密码文件passwd是否存在,存在则载入列表,不存在就重新创建一个空字典 if os.path.exists(fileName): #载入用户列表,数据结构为字典,k=userName,v=passwdMd5 with open("passwd", "r+") as loadsFn: userDB = json.loads(loadsFn.read()) else: userDB = {} #让用户输入用户名 userName = raw_input("姓名:") #标志位:控制循环跳出 flag = True while flag: #用户注册时,需输入两次密码 passwd1 = raw_input("密码:") passwd2 = raw_input("确认密码:") #如果两次密码不一致,则不执行下一步,再次输入密码并进行确认 if not passwd1 == passwd2: continue else: #两次输入密码一致,标志位置为False,下次跳出循环 flag = False #调用calc_md5函数将明文密码转为对应的md5值,用于保存 passwdMd5 = calc_md5(passwd1) #将用户名与密码对应存入字典userDB中 userDB[userName] = passwdMd5 #将用户名和密码存入文件 with open(fileName, "w") as dumpFn: dumpFn.write(json.dumps(userDB)) #用户登录验证,装饰器 def login(func): def decorater(*args,**kwargs): #判断passwd文件是否存在,存在则载入userDB(用户:密码),否则就重新注册新的passwd文件并返回 if os.path.exists(fileName): with open("passwd", "r+") as loadsFn: userDB = json.loads(loadsFn.read()) else: print "密码文件不存在,建议重新注册!!" register() return name = raw_input("用户名:") #用户名是否存在,存在就继续输入密码,不存在则进行注册 if name in userDB.keys(): flag = True counter = 0 #循环输入密码,密码正确,flag=False(下次直接跳出循环)并执行函数,密码错误则允许尝试3次,超过3次验证失败,退出验证 while flag: passwd = raw_input("密码:") passwdMd5 = calc_md5(passwd) if passwdMd5 == userDB[name]: flag = False func(*args,**kwargs) elif counter > 2: print "您已经尝试了3次,请过会儿再试!!" return else: counter += 1 else: print "用户名不存在,请您先进行注册!" register() return decorater if __name__ == "__main__": @login def hello(): print "Hello world!" hello()
到此这篇关于基于Python制作一个文件去重小工具的文章就介绍到这了,更多相关Python文件去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?