網站首頁 編程語言 正文
前言
常常在下載網絡素材時有很多的重復文件亂七八糟的,于是想實現一個去重的操作。
主要實現思路就是遍歷出某個文件夾包括其子文件夾下面的所有文件,最后,將所有文件通過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()
原文鏈接:https://www.cnblogs.com/lwsbc/p/15911168.html
相關推薦
- 2022-05-17 ribbon和nacos獲取服務列表不一致問題
- 2022-06-08 Python?全局空間和局部空間_python
- 2022-11-10 Android獲取設備傳感器的方法_Android
- 2022-05-31 jQuery實現側邊導航欄及滑動電梯效果(仿淘寶)_jquery
- 2022-03-15 ant design: Instance created by `useForm` is not c
- 2022-01-29 寶塔Linux面板的ftp無法使用連接解決方案
- 2022-06-06 typescript類型別名、限制值的大小
- 2022-04-07 你知道怎么在?HTML?頁面中使用?React嗎_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支