基于Python制作一個文件去重小工具
前言
常常在下載網(wǎng)絡(luò)素材時有很多的重復(fù)文件亂七八糟的,于是想實現(xiàn)一個去重的操作。

主要實現(xiàn)思路就是遍歷出某個文件夾包括其子文件夾下面的所有文件,最后,將所有文件通過MD5函數(shù)的對比篩選出來,最后將重復(fù)的文件移除。

實現(xiàn)步驟
用到的第三方庫都比較的常見,其中只有hashlib是用來對比文件的不是很常見。其他的都是一些比較常見的第三方庫用來做輔助操作。
import os # 應(yīng)用文件操作 import hashlib # 文件對比操作 import logging # 日志函數(shù)操作 import sys # 系統(tǒng)應(yīng)用操作
日志的設(shè)置基本都是這一套的范式,按照規(guī)則設(shè)置好日志打印的相關(guān)信息。
logger = logging.getLogger('系統(tǒng)文件去重')
logging.basicConfig(format='%(asctime)s %(levelname)-8s: %(message)s')
logger.setLevel(logging.DEBUG)
文件去重的實現(xiàn)邏輯代碼塊如下:
diretory = input('請輸入需要整理的文件目錄: \n') # 去重的文件夾路徑
if os.path.isdir(diretory):
logger.info('當(dāng)前目錄[' + 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('當(dāng)前比對路徑: '+ 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 + ']出現(xiàn)重復(fù)已經(jīng)移除!')
else:
md5s.append(md5_value)
except:
logger.error('[' + file_name_path + ']對比發(fā)生異常,執(zhí)行下一個!')
else:
logger.error('輸入的文件夾或者目錄不存在!')
以上就是文件去重的整個實現(xiàn)過程,用來做一個清理電腦文件的小工具還是比較實用的。
補(bǔ)充
本文中主要是利用hashlib.md5()函數(shù)實現(xiàn)的,下面小編為大家重點介紹一下hashlib.md5()
Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?
摘要算法又稱哈希算法、散列算法。它通過一個函數(shù),把任意長度的數(shù)據(jù)轉(zhuǎn)換為一個長度固定的數(shù)據(jù)串(通常用16進(jìn)制的字符串表示)。 舉個例子,你寫了一篇文章,內(nèi)容是一個字符串'how to use python hashlib - by Michael',并附上這篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,并發(fā)表為'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因為根據(jù)'how to use python hashlib - by Bob'計算出的摘要不同于原始文章的摘要。
可見,摘要算法就是通過摘要函數(shù)f()對任意長度的數(shù)據(jù)data計算出固定長度的摘要digest,目的是為了發(fā)現(xiàn)原始數(shù)據(jù)是否被人篡改過。
摘要算法之所以能指出數(shù)據(jù)是否被篡改過,就是因為摘要函數(shù)是一個單向函數(shù),計算f(data)很容易,但通過digest反推data卻非常困難。而且,對原始數(shù)據(jù)做一個bit的修改,都會導(dǎo)致計算出的摘要完全不同。
當(dāng)然,hashlib.md5()除了可以用來給文件去重,還能做到密碼加密,下面是示例代碼
#!/usr/bin/env python
#-*- coding:utf-8 -*-
"""
功能:
登錄驗證模塊
詳細(xì)說明:
1.密碼文件為passwd
2.passwd未創(chuàng)建或丟失,會提示:密碼文件不存在,建議重新注冊!!
3.未注冊用戶登錄會提示:用戶名不存在,請您先進(jìn)行注冊!
4.已注冊用戶登錄時,忘記密碼,嘗試3次后密碼還不正確則退出驗證,等一會兒則可以重新登錄
5.作為裝飾器進(jìn)行登錄驗證
"""
import json
import hashlib
import os
pwd = os.getcwd()
fileName = os.path.join(pwd,"passwd")
#將明文密碼通過md5進(jìn)行加密,返回一個加密后的md5的值
def calc_md5(passwd):
md5 = hashlib.md5("haliluya")
md5.update(passwd)
ret = md5.hexdigest()
return ret
#新用戶注冊模塊
def register():
#判斷密碼文件passwd是否存在,存在則載入列表,不存在就重新創(chuàng)建一個空字典
if os.path.exists(fileName):
#載入用戶列表,數(shù)據(jù)結(jié)構(gòu)為字典,k=userName,v=passwdMd5
with open("passwd", "r+") as loadsFn:
userDB = json.loads(loadsFn.read())
else:
userDB = {}
#讓用戶輸入用戶名
userName = raw_input("姓名:")
#標(biāo)志位:控制循環(huán)跳出
flag = True
while flag:
#用戶注冊時,需輸入兩次密碼
passwd1 = raw_input("密碼:")
passwd2 = raw_input("確認(rèn)密碼:")
#如果兩次密碼不一致,則不執(zhí)行下一步,再次輸入密碼并進(jìn)行確認(rèn)
if not passwd1 == passwd2:
continue
else:
#兩次輸入密碼一致,標(biāo)志位置為False,下次跳出循環(huán)
flag = False
#調(diào)用calc_md5函數(shù)將明文密碼轉(zhuǎn)為對應(yīng)的md5值,用于保存
passwdMd5 = calc_md5(passwd1)
#將用戶名與密碼對應(yīng)存入字典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("用戶名:")
#用戶名是否存在,存在就繼續(xù)輸入密碼,不存在則進(jìn)行注冊
if name in userDB.keys():
flag = True
counter = 0
#循環(huán)輸入密碼,密碼正確,flag=False(下次直接跳出循環(huán))并執(zhí)行函數(shù),密碼錯誤則允許嘗試3次,超過3次驗證失敗,退出驗證
while flag:
passwd = raw_input("密碼:")
passwdMd5 = calc_md5(passwd)
if passwdMd5 == userDB[name]:
flag = False
func(*args,**kwargs)
elif counter > 2:
print "您已經(jīng)嘗試了3次,請過會兒再試!!"
return
else:
counter += 1
else:
print "用戶名不存在,請您先進(jìn)行注冊!"
register()
return decorater
if __name__ == "__main__":
@login
def hello():
print "Hello world!"
hello()到此這篇關(guān)于基于Python制作一個文件去重小工具的文章就介紹到這了,更多相關(guān)Python文件去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python RabbitMQ 使用詳細(xì)介紹(小結(jié))
這篇文章主要介紹了python RabbitMQ 使用詳細(xì)介紹(小結(jié)),詳細(xì)的介紹了RabbitMQ的概念以及使用,對學(xué)習(xí)RabbitMQ有一定的幫助,非常具有實用價值,需要的朋友可以參考下2018-11-11
python 把數(shù)據(jù) json格式輸出的實例代碼
下面小編就為大家?guī)硪黄猵ython 把數(shù)據(jù) json格式輸出的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10

