<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
常常在下載網路素材時有很多的重複檔案亂七八糟的,於是想實現一個去重的操作。
主要實現思路就是遍歷出某個資料夾包括其子資料夾下面的所有檔案,最後,將所有檔案通過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檔案去重內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45