欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python制作一個(gè)文件去重小工具

 更新時(shí)間:2022年02月19日 14:29:02   作者:Python 集中營(yíng)  
我們常常在下載網(wǎng)絡(luò)素材時(shí)會(huì)下載很多的重復(fù)文件亂七八糟的,于是想實(shí)現(xiàn)一個(gè)去重的操作就顯得很重要。本文將用Python制作一個(gè)簡(jiǎn)單的文件去重小工具,需要的可以參考一下

前言

常常在下載網(wǎng)絡(luò)素材時(shí)有很多的重復(fù)文件亂七八糟的,于是想實(shí)現(xiàn)一個(gè)去重的操作。

file

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

file

實(shí)現(xiàn)步驟

用到的第三方庫(kù)都比較的常見(jiàn),其中只有hashlib是用來(lái)對(duì)比文件的不是很常見(jiàn)。其他的都是一些比較常見(jiàn)的第三方庫(kù)用來(lái)做輔助操作。

import os  # 應(yīng)用文件操作
import hashlib  # 文件對(duì)比操作
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)

文件去重的實(shí)現(xiàn)邏輯代碼塊如下:

diretory = input('請(qǐng)輸入需要整理的文件目錄: \n')  # 去重的文件夾路徑

if os.path.isdir(diretory):
    logger.info('當(dāng)前目錄[' + diretory + ']校驗(yàn)成功!')
    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)前比對(duì)路徑: '+ 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 + ']對(duì)比發(fā)生異常,執(zhí)行下一個(gè)!')

else:
    logger.error('輸入的文件夾或者目錄不存在!')

以上就是文件去重的整個(gè)實(shí)現(xiàn)過(guò)程,用來(lái)做一個(gè)清理電腦文件的小工具還是比較實(shí)用的。

補(bǔ)充

本文中主要是利用hashlib.md5()函數(shù)實(shí)現(xiàn)的,下面小編為大家重點(diǎn)介紹一下hashlib.md5()

Python的hashlib提供了常見(jiàn)的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?

摘要算法又稱(chēng)哈希算法、散列算法。它通過(guò)一個(gè)函數(shù),把任意長(zhǎng)度的數(shù)據(jù)轉(zhuǎn)換為一個(gè)長(zhǎng)度固定的數(shù)據(jù)串(通常用16進(jìn)制的字符串表示)。 舉個(gè)例子,你寫(xiě)了一篇文章,內(nèi)容是一個(gè)字符串'how to use python hashlib - by Michael',并附上這篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,并發(fā)表為'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因?yàn)楦鶕?jù)'how to use python hashlib - by Bob'計(jì)算出的摘要不同于原始文章的摘要。

可見(jiàn),摘要算法就是通過(guò)摘要函數(shù)f()對(duì)任意長(zhǎng)度的數(shù)據(jù)data計(jì)算出固定長(zhǎng)度的摘要digest,目的是為了發(fā)現(xiàn)原始數(shù)據(jù)是否被人篡改過(guò)。

摘要算法之所以能指出數(shù)據(jù)是否被篡改過(guò),就是因?yàn)檎瘮?shù)是一個(gè)單向函數(shù),計(jì)算f(data)很容易,但通過(guò)digest反推data卻非常困難。而且,對(duì)原始數(shù)據(jù)做一個(gè)bit的修改,都會(huì)導(dǎo)致計(jì)算出的摘要完全不同。

當(dāng)然,hashlib.md5()除了可以用來(lái)給文件去重,還能做到密碼加密,下面是示例代碼

#!/usr/bin/env python
#-*- coding:utf-8 -*-
"""
功能:
    登錄驗(yàn)證模塊
詳細(xì)說(shuō)明:
    1.密碼文件為passwd
    2.passwd未創(chuàng)建或丟失,會(huì)提示:密碼文件不存在,建議重新注冊(cè)!!
    3.未注冊(cè)用戶(hù)登錄會(huì)提示:用戶(hù)名不存在,請(qǐng)您先進(jìn)行注冊(cè)!
    4.已注冊(cè)用戶(hù)登錄時(shí),忘記密碼,嘗試3次后密碼還不正確則退出驗(yàn)證,等一會(huì)兒則可以重新登錄
    5.作為裝飾器進(jìn)行登錄驗(yàn)證
"""
import json
import hashlib
import os
pwd = os.getcwd()
fileName = os.path.join(pwd,"passwd")

#將明文密碼通過(guò)md5進(jìn)行加密,返回一個(gè)加密后的md5的值
def calc_md5(passwd):
    md5 = hashlib.md5("haliluya")
    md5.update(passwd)
    ret = md5.hexdigest()
    return ret


#新用戶(hù)注冊(cè)模塊
def register():
    #判斷密碼文件passwd是否存在,存在則載入列表,不存在就重新創(chuàng)建一個(gè)空字典
    if os.path.exists(fileName):
        #載入用戶(hù)列表,數(shù)據(jù)結(jié)構(gòu)為字典,k=userName,v=passwdMd5
        with open("passwd", "r+") as loadsFn:
            userDB = json.loads(loadsFn.read())
    else:
        userDB = {}
    #讓用戶(hù)輸入用戶(hù)名
    userName = raw_input("姓名:")
    #標(biāo)志位:控制循環(huán)跳出
    flag = True
    while flag:
        #用戶(hù)注冊(cè)時(shí),需輸入兩次密碼
        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)為對(duì)應(yīng)的md5值,用于保存
        passwdMd5 = calc_md5(passwd1)
    #將用戶(hù)名與密碼對(duì)應(yīng)存入字典userDB中
    userDB[userName] = passwdMd5
    #將用戶(hù)名和密碼存入文件
    with open(fileName, "w") as dumpFn:
        dumpFn.write(json.dumps(userDB))


#用戶(hù)登錄驗(yàn)證,裝飾器
def login(func):
    def decorater(*args,**kwargs):
        #判斷passwd文件是否存在,存在則載入userDB(用戶(hù):密碼),否則就重新注冊(cè)新的passwd文件并返回
        if os.path.exists(fileName):
            with open("passwd", "r+") as loadsFn:
                userDB = json.loads(loadsFn.read())
        else:
            print "密碼文件不存在,建議重新注冊(cè)?。?
            register()
            return

        name = raw_input("用戶(hù)名:")
        #用戶(hù)名是否存在,存在就繼續(xù)輸入密碼,不存在則進(jìn)行注冊(cè)
        if name in userDB.keys():
            flag = True
            counter = 0
            #循環(huán)輸入密碼,密碼正確,flag=False(下次直接跳出循環(huán))并執(zhí)行函數(shù),密碼錯(cuò)誤則允許嘗試3次,超過(guò)3次驗(yàn)證失敗,退出驗(yàn)證
            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次,請(qǐng)過(guò)會(huì)兒再試??!"
                    return
                else:
                    counter += 1
        else:
            print "用戶(hù)名不存在,請(qǐng)您先進(jìn)行注冊(cè)!"
            register()
    return decorater

if __name__ == "__main__":
    @login
    def hello():
        print "Hello world!"
    hello()

到此這篇關(guān)于基于Python制作一個(gè)文件去重小工具的文章就介紹到這了,更多相關(guān)Python文件去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python多線程實(shí)現(xiàn)模擬火車(chē)站售票

    Python多線程實(shí)現(xiàn)模擬火車(chē)站售票

    這篇文章主要為大家詳細(xì)介紹了Python多線程實(shí)現(xiàn)模擬火車(chē)站售票,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • python RabbitMQ 使用詳細(xì)介紹(小結(jié))

    python RabbitMQ 使用詳細(xì)介紹(小結(jié))

    這篇文章主要介紹了python RabbitMQ 使用詳細(xì)介紹(小結(jié)),詳細(xì)的介紹了RabbitMQ的概念以及使用,對(duì)學(xué)習(xí)RabbitMQ有一定的幫助,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-11-11
  • Python Pygame制作雪夜煙花景

    Python Pygame制作雪夜煙花景

    這篇文章主要為大家詳細(xì)介紹了如何利用Python中的Pygame模塊制作一個(gè)雪夜煙花景,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下
    2022-01-01
  • Python Flask入門(mén)

    Python Flask入門(mén)

    今天小編就為大家分享一篇Python Flask的入門(mén)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-11-11
  • Python迭代用法實(shí)例教程

    Python迭代用法實(shí)例教程

    這篇文章主要介紹了Python迭代用法,包括了迭代的定義及具體用法,是一個(gè)非常實(shí)用的技巧,需要的朋友可以參考下
    2014-09-09
  • python將圖片轉(zhuǎn)為矢量圖的方法步驟

    python將圖片轉(zhuǎn)為矢量圖的方法步驟

    這篇文章主要介紹了python將圖片轉(zhuǎn)為矢量圖的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 分享幾道你可能遇到的python面試題

    分享幾道你可能遇到的python面試題

    最近去筆試,在面試過(guò)程中遇到了幾個(gè)編程題,比較基礎(chǔ)。所以想著總結(jié)一下,所以下面這篇文章主要給大家分享了幾道你可能遇到的python面試題,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。
    2017-07-07
  • Django框架創(chuàng)建項(xiàng)目的方法入門(mén)教程

    Django框架創(chuàng)建項(xiàng)目的方法入門(mén)教程

    這篇文章主要介紹了Django框架創(chuàng)建項(xiàng)目的方法,結(jié)合實(shí)例形式分析了Django框架管理工具的使用及創(chuàng)建項(xiàng)目的相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • python 把數(shù)據(jù) json格式輸出的實(shí)例代碼

    python 把數(shù)據(jù) json格式輸出的實(shí)例代碼

    下面小編就為大家?guī)?lái)一篇python 把數(shù)據(jù) json格式輸出的實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • pytorch permute維度轉(zhuǎn)換方法

    pytorch permute維度轉(zhuǎn)換方法

    今天小編就為大家分享一篇pytorch permute維度轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12

最新評(píng)論