最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用CRC實現(xiàn)圖片去重

 更新時間:2023年10月31日 14:03:40   作者:lyshark  
這篇文章主要為大家詳細(xì)介紹了Python如何使用CRC實現(xiàn)圖片去重功能,文中的示例代碼講解詳細(xì),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

使用CRC32還可實現(xiàn)圖片去重功能,如下FindRepeatFile函數(shù),運行后通過對所有文件做crc校驗并將校驗值存儲至CatalogueDict字典內(nèi),接著依次提取CRC特征值并將其存儲至CatalogueList列表內(nèi),接著通過統(tǒng)計特征值出現(xiàn)次數(shù)并將該次數(shù)放入到CountDict字典內(nèi),最后循環(huán)這個字典,并以此輸出文件特征與重復(fù)次數(shù),將重復(fù)值放入到RepeatFileFeatures列表內(nèi)。

如下代碼所示;

import zlib,os

def Find_Repeat_File(file_path,file_type):
    Catalogue = os.listdir(file_path)
    CatalogueDict = {}  # 查詢字典,方便后期查詢鍵值對對應(yīng)參數(shù)
    for each in Catalogue:
        path = (file_path + each)
        if os.path.splitext(path)[1] == file_type:
            with open(path,"rb") as fp:
                crc32 = zlib.crc32(fp.read())
                # print("[*] 文件名: {} CRC32校驗: {}".format(path,str(crc32)))
                CatalogueDict[each] = str(crc32)
    CatalogueList = []
    for value in CatalogueDict.values():
    # 該過程實現(xiàn)提取字典中的crc32特征組合成列表 CatalogueList
        CatalogueList.append(value)

    CountDict = {}
    for each in CatalogueList:
    # 該過程用于存儲文件特征與特征重復(fù)次數(shù),放入 CountDict
        CountDict[each] = CatalogueList.count(each)
        
    RepeatFileFeatures = []
    for key,value in CountDict.items():
    # 循環(huán)查找字典中的數(shù)據(jù),如果value大于1就存入 RepeatFileFeatures
        if value > 1:
            print("[-] 文件特征: {} 重復(fù)次數(shù): {}".format(key,value))
            RepeatFileFeatures.append(key)

if __name__ == "__main__":
    Find_Repeat_File("D://lyshark/",".png")

運行上述代碼,則會掃描d://lyshark/目錄下所有的png格式文件,并輸出這些文件特征值,以及該特征的重復(fù)次數(shù),如下圖所示;

有了上述方法我們就可以實現(xiàn)去重了,當(dāng)然上述方法還可以優(yōu)化,通過使用groupby功能可以自動實現(xiàn)分組,f恩組后我們只需要對分組進(jìn)行排序,并尋找對應(yīng)符合條件的特征,找到后直接調(diào)用os.remove將其移除即可,實現(xiàn)代碼如下所示;

import zlib,os,argparse
from operator import itemgetter
from itertools import groupby

def Find_Repeat_File(file_path,file_type):
    Catalogue = os.listdir(file_path)
    CatalogueList = []
    for each in Catalogue:
        path = (file_path + each)
        if os.path.splitext(path)[1] == file_type:
            with open(path,"rb") as fp:
                crc32 = zlib.crc32(fp.read())
                # print("[*] 文件名: {} CRC32校驗: {}".format(path,str(crc32)))
                CatalogueList.append({ "CRC32": str(crc32) , "FILE": path })
    
    # 首先排序,然后根據(jù)字典中的CRC32排序
    CatalogueList.sort(key=itemgetter("CRC32"))
    for key,value in groupby(CatalogueList,key=itemgetter("CRC32")):
        # print("[*] CRC32特征碼: {}\t".format(key))
        for each in value:
            RepeatNumber = len(list(value))
            if (RepeatNumber+1) > 1:
                try:
                    print("---> 重復(fù)圖片: {} 已移除".format(each.values()))
                    os.remove(str(list(each.values())[1]))
                except FileNotFoundError:
                    pass

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-d","--dirs",dest="dirs",help="指定目錄路徑")
    parser.add_argument("-t","--types",dest="types",help="指定文件類型")
    args = parser.parse_args()
    # 使用方式: main.py -d "d://lyshark/" -t ".png"
    if args.dirs and args.types:
        os.chdir(args.dirs)
        try:
            for each in range(0,len(os.listdir())):
                Find_Repeat_File("./",args.types)
        except:
            pass
    else:
        parser.print_help()

如下圖所示,我們通過傳入d://lyshark/并設(shè)置.png類型,掃描該目錄下所有重復(fù)文件,并將該文件移除,輸出效果如下圖所示;

當(dāng)然上述方法是一次性清楚重復(fù)文件,在某些時候我們希望存入文件后自動清理,此時就需要動態(tài)監(jiān)控文件或目錄變化,函數(shù)MonitoringDirectory()可用于動態(tài)監(jiān)控用戶目錄,當(dāng)有新文件創(chuàng)建時自動校驗是否存在該文件如果存在則刪除重復(fù)的,其實現(xiàn)原理是不間斷的遍歷目錄,當(dāng)有新文件產(chǎn)生時自動將該文件計算特征對比,如果重復(fù)則刪除,該方式雖然可實現(xiàn)目錄監(jiān)控但效率卻很低,因為要不間斷的遍歷目錄。

import os, time
from zlib import crc32

# 計算目標(biāo)CRC32
def Calculation_crc32(filename):
    try:
        with open(filename,"rb") as fp:
            crc = crc32(fp.read())
            while True:
                temp = fp.read(8196)
                if not temp:
                    break
            fp.close()
            return crc
    except Exception:
        fp.close()
        return 0
    return 0

# 開始監(jiān)控目錄
def MonitoringDirectory(path_to_watch):
    crc_poll = []

    before = dict([(f, None) for f in os.listdir(path_to_watch)])
    while True:
        time.sleep (0.3)

        after = dict ([(f, None) for f in os.listdir (path_to_watch)])
        added = [f for f in after if not f in before]
        removed = [f for f in before if not f in after]

        # 新增文件時觸發(fā)
        if added:
            # print("新建文件: {}".format(added))
            for index in range(0,len(added)):
                # 計算文件CRC32
                AbsolutePath = path_to_watch + "/" + added[index]
                crc = Calculation_crc32(AbsolutePath)
                print(f"計算文件路徑: {AbsolutePath} 文件CRC32: {crc}")

                # 只要有新文件則加入到crc_pool
                if crc != 0:
                    crc_poll.append(crc)

                print("池內(nèi)數(shù)據(jù): {}".format(crc_poll))
                crc_count = 0

                # 循環(huán)池內(nèi)的所有CRC數(shù)據(jù)
                for index in range(0,len(crc_poll)):

                    # 如果當(dāng)前文件CRC與池內(nèi)某個一致則遞增
                    if crc_poll[index] == crc:
                        crc_count = crc_count + 1

                    # 只要大于2則說明有重復(fù)的
                    if crc_count >= 2:
                        try:
                            print("存在校驗值,刪除文件: {}".format(AbsolutePath))
                            os.remove(AbsolutePath)
                            crc_poll.remove(crc)
                        except Exception:
                            pass
        # 刪除文件時觸發(fā)
        if removed:
            print("移除文件: {}".format(removed))
        before = after

if __name__ == "__main__":
    MonitoringDirectory("d://lyshark")

運行上述程序,則會監(jiān)控d://lyshark目錄,當(dāng)有心文件被創(chuàng)建時會自動對比特征值,如果相同則會被清理,如果無重復(fù)的則會被保留,如下圖所示;

到此這篇關(guān)于Python使用CRC實現(xiàn)圖片去重的文章就介紹到這了,更多相關(guān)Python圖片去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解python深淺拷貝區(qū)別

    詳解python深淺拷貝區(qū)別

    在本篇文章里小編給大家整理了關(guān)于python深淺拷貝區(qū)別的相關(guān)知識點總結(jié),有興趣的朋友們可以參考下。
    2019-06-06
  • python判斷正負(fù)數(shù)方式

    python判斷正負(fù)數(shù)方式

    這篇文章主要介紹了python判斷正負(fù)數(shù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python requests.post帶head和body的實例

    python requests.post帶head和body的實例

    今天小編就為大家分享一篇python requests.post帶head和body的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python實現(xiàn)指定范圍內(nèi)篩選并剔除Excel表格中的數(shù)據(jù)

    Python實現(xiàn)指定范圍內(nèi)篩選并剔除Excel表格中的數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了Python如何實現(xiàn)在指定范圍內(nèi)篩選并剔除Excel表格中的數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-06-06
  • 如何Python使用設(shè)置word的頁邊距

    如何Python使用設(shè)置word的頁邊距

    在編寫或處理Word文檔的過程中,頁邊距是一個不可忽視的排版要素,本文將介紹如何使用Python設(shè)置Word文檔中各個節(jié)的頁邊距,需要的可以參考下
    2025-05-05
  • python設(shè)定并獲取socket超時時間的方法

    python設(shè)定并獲取socket超時時間的方法

    今天小編就為大家分享一篇python設(shè)定并獲取socket超時時間的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 詳解Python中Pyyaml模塊的使用

    詳解Python中Pyyaml模塊的使用

    這篇文章主要介紹了Python中Pyyaml模塊的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • python進(jìn)程的狀態(tài)、創(chuàng)建及使用方法詳解

    python進(jìn)程的狀態(tài)、創(chuàng)建及使用方法詳解

    這篇文章主要介紹了python進(jìn)程的狀態(tài)、創(chuàng)建及使用方法,結(jié)合實例形式詳細(xì)分析了Python進(jìn)程的概念、原理、工作狀態(tài)、創(chuàng)建以及使用方法,需要的朋友可以參考下
    2019-12-12
  • pytorch  網(wǎng)絡(luò)參數(shù) weight bias 初始化詳解

    pytorch 網(wǎng)絡(luò)參數(shù) weight bias 初始化詳解

    這篇文章主要介紹了pytorch 網(wǎng)絡(luò)參數(shù) weight bias 初始化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 分享Python開發(fā)中要注意的十個小貼士

    分享Python開發(fā)中要注意的十個小貼士

    不管是python開發(fā)還是其他什么語言的開發(fā),如果在開發(fā)中我們能掌握一些有用的貼士和技巧,那么肯定會大大提高我們的開發(fā)效率,今天小編和大家分享的就是python開發(fā)中,一些初學(xué)這門語言常常會犯的錯誤,一起來看看吧。
    2016-08-08

最新評論

莱州市| 田东县| 宜阳县| 双峰县| 鹤庆县| 隆化县| 宁城县| 四川省| 仙居县| 容城县| 河东区| 广昌县| 深泽县| 民丰县| 巍山| 德令哈市| 关岭| 贞丰县| 玉田县| 海南省| 云和县| 嵩明县| 镇原县| 兴城市| 加查县| 闵行区| 孝义市| 威信县| 梨树县| 凤城市| 齐河县| 福海县| 临汾市| 宣汉县| 胶州市| 鸡东县| 如皋市| 海宁市| 新闻| 宜宾市| 平远县|