首頁 > 軟體

基於Python製作一個檔案去重小工具

2022-02-19 16:00:41

前言

常常在下載網路素材時有很多的重複檔案亂七八糟的,於是想實現一個去重的操作。

主要實現思路就是遍歷出某個資料夾包括其子資料夾下面的所有檔案,最後,將所有檔案通過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!


IT145.com E-mail:sddin#qq.com