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

使用Python實現(xiàn)文件查重功能

 更新時間:2024年12月30日 11:29:52   作者:hvinsion  
這篇文章主要為大家詳細介紹了Python如何通過循環(huán)進行刪除重復文件,從而達到文件查重功能,文中的示例代碼講解詳細,需要的小伙伴可以參考下

1.簡介

這是一個Python文件去重的工具,市面上很多檢測重復工具的軟件,都是要付費或者要破解的。于是就想著能不能自己做一個后臺每時每刻都可以自己去重的工具。雖然市面上很多檢測重復工具的軟件. 但是這個工具使用環(huán)境和那些工具很不一樣。 別的工具刪重復文件, 都是掃描,自己刪除.。需要人工值守.。這邊的工具掃描刪除不需要人工值守,并且可以后臺運行。這邊設置好了,就可以吃著火鍋唱著歌干別的去了。只要電腦不斷電可以一直運行操作。別的軟件必須得等掃描完,才能做下一步操作,這個是本質區(qū)別。

2.工具功能

1 通過檢測MD5,來判斷是否有文件重復,檢測過后,可以自行選擇刪除或者不刪除,.或者移動到回收站還是直接刪除。

2 循環(huán)檢測指定目錄的重復文件,只要是新生成了重復文件,就會立刻被刪除。

3 刪除默認會保留最早的文件。

**注:**只要文件屬性不一樣,即使文件名一樣也能查重成功。

3.運行效果

4.相關源碼

import sys, os, filecmp
import time
from win32com.shell import shell,shellcon



def deltorecyclebin(filename):
    #print('deltorecyclebin', filename)
    # os.remove(filename) #直接刪除文件,不經(jīng)過回收站
    res= shell.SHFileOperation((0,shellcon.FO_DELETE,filename,None, shellcon.FOF_SILENT | shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION,None,None))  #刪除文件到回收站
    #print(res)
        # if not res[1]:
        #     os.system('del '+filename)

#清理重復文件
def md5(fname, chunk_size=1024):
    import hashlib
    hash = hashlib.md5()
    with open(fname, "rb") as f:
        chunk = f.read(chunk_size)
        while chunk:
            hash.update(chunk)
            chunk = f.read(chunk_size)
    return hash.hexdigest()

def check_for_duplicates(dufilelist):    
    sizes = {}
    hashes = {}
    duplicates = []
    # Traverse all the files and store their size in a reverse index map
    # 遍歷所有文件并將其大小存儲在反向索引映射中
    files_count = 0
    #print(dufilelist)
    for s in dufilelist:
        for root, _dirs, files in os.walk(s, topdown=True, onerror=None, followlinks=False):
            files_count += len(files)
            for f in files:
                file = os.path.join(root, f)
                size = os.stat(file).st_size
                if size not in sizes:
                    sizes[size] = []
                sizes[size].append(file)
    #print("Traversed {} files".format(files_count))

    # Remove empty files from the size map
    # 從大小映射中刪除空文件
    if 0 in sizes:
        del sizes[0]

    # Remove files with unique sizes from the size map
    # 從大小映射中刪除具有唯一大小的文件
    for (key, value) in list(sizes.items()):
        if len(value) == 1:
            del sizes[key]

    # Traverse the size map and enrich it with hashes
    # 遍歷大小映射并用哈希值豐富它
    for (size, files) in sizes.items():
        for file in files:            
            try:
                hash = md5(file)
            except:
                continue 
            tuple = (size, hash)
            if tuple not in hashes:
                hashes[tuple] = []
            hashes[tuple].append(file)

    # Remove files with unique (size, hash) tuple in hash map
    # 刪除哈希映射中具有唯一(大小,哈希)元組的文件
    for (key, value) in list(hashes.items()):
        if len(value) == 1:
            del hashes[key]

    # Compare file pairs
    # 比較文件對    
    for possible_list in hashes.values():
        #print(possible_list)
        #這里把文件按著時間排序:
        if possible_list:
            # 注意,這里使用lambda表達式,將文件按照最后修改時間順序升序排列
            # os.path.getmtime() 函數(shù)是獲取文件最后修改時間
            # os.path.getctime() 函數(shù)是獲取文件最后創(chuàng)建時間
            possible_list = sorted(possible_list,key=lambda x: os.path.getctime(x))
        

        while possible_list:
            first = possible_list[0]
            copy = [first]
            for other in possible_list[1:]:
                if filecmp.cmp(first, other, shallow=False):
                    copy.append(other)
            for c in copy:
                possible_list.remove(c)
            duplicates.append(copy)

    #print(duplicates)
    # Print duplicates
    # 打印相同  
    groupready=[]
    for _i, group in enumerate(duplicates):
        print("第 " + str(int(_i) + 1) + " 組")
        assert len(group) > 1
        #print("%r:" % (i + 1))
        if onlyprint: 
            for d in group:
                pass
                print("發(fā)現(xiàn)相同文件:  %r" % (d))
            for d in group[1:]:
                groupready.append(d)

            #print("全部要刪除的文件: "+str(groupready))

        else:
            if filedelete:
                for d in group[1:]:
                    os.remove(d)
                    print("直接刪除重復文件%r" % (d))
            else:
                for d in group[1:]:
                    deltorecyclebin(d)
                    print("回收重復文件%r" % (d))
                


    if not duplicates:
        print("目錄里沒有找到重復文件")


    if len(groupready)>0:
        print("--------------------------------分割線------------------------------------------")
        print("下面列出重復的文件:")
        for num in groupready:
            print(num)

        reback=input("輸入d直接刪除以上的重復文件, ,輸入r將以上重復文件放入回收站,,取消請任意輸入n或者關閉本窗口.請輸入: d/r/n:")
        if reback=="d":
            for num in groupready:
                os.remove(num)
                print("直接刪除重復文件%r" % (num)) 
        elif reback=="r":
            for num in groupready:
                deltorecyclebin(num)
                print("回收重復文件%r" % (num)) 
        else: 
            print("取消操作")







if __name__ == "__main__":        
    loopinfo=input("是否循環(huán)檢測重復文件? y/n:")
    if loopinfo=="y":
        loopinfoable=-1
    else:
        loopinfoable=1

    onlyprintAble=input("只檢測重復文件請輸入y,檢測并且自動刪除重復文件請輸入n y/n:")
    if onlyprintAble=="y":
        onlyprint=True   
    else:
        onlyprint=False   
        filedeleteAble=input("重復文件放入回收站請輸入y ,直接刪除重復文件請輸入n y/n:")
        if filedeleteAble=="y":
            filedelete=False   #是否強制刪除
        else:
            filedelete=True   #是否強制刪除



    filepath=input("請輸入要檢測重復文件的目錄:")    

    time_start=time.time()

    while loopinfoable: 
        loopinfoable=loopinfoable-1   
        
        
        print("程序開始...請等待一會...我正在努力為主人干活中o(′^`)o...")
        dufilelist=[filepath]    
        check_for_duplicates(dufilelist)


        
        #下面是計算時間
        time_end=time.time()
        seconds=time_end-time_start
        m, s = divmod(seconds, 60)
        h, m = divmod(m, 60)
        print('當前程序總共用時:%02d:%02d:%02d' % (h, m, s))        
        if loopinfoable!=0: #不循環(huán)
            time.sleep(3)

    input("程序結束,按回車退出")

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

相關文章

  • 在Python中進行自動化單元測試的教程

    在Python中進行自動化單元測試的教程

    這篇文章主要介紹了在Python中進行自動化單元測試的教程,本文來自于IBM官方文檔,需要的朋友可以參考下
    2015-04-04
  • python+selenium select下拉選擇框定位處理方法

    python+selenium select下拉選擇框定位處理方法

    今天小編就為大家分享一篇python+selenium select下拉選擇框定位處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python利用Scrapy框架爬取豆瓣電影示例

    Python利用Scrapy框架爬取豆瓣電影示例

    這篇文章主要介紹了Python利用Scrapy框架爬取豆瓣電影,結合實例形式分析了Python使用Scrapy框架爬取豆瓣電影信息的具體操作步驟、實現(xiàn)技巧與相關注意事項,需要的朋友可以參考下
    2020-01-01
  • 使用python將時間轉換為指定的格式方法

    使用python將時間轉換為指定的格式方法

    今天小編就為大家分享一篇使用python將時間轉換為指定的格式方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Conda國內鏡像源及配置過程

    Conda國內鏡像源及配置過程

    文章介紹Conda鏡像源使用方法,涵蓋臨時指定單個/多個源、永久配置及恢復默認設置,同時說明main(官方穩(wěn)定)、free(逐漸棄用)、conda-forge(社區(qū)更新快)等倉庫的區(qū)別與適用場景
    2025-08-08
  • 使用Tensorflow-GPU禁用GPU設置(CPU與GPU速度對比)

    使用Tensorflow-GPU禁用GPU設置(CPU與GPU速度對比)

    這篇文章主要介紹了使用Tensorflow-GPU禁用GPU設置(CPU與GPU速度對比),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python gevent協(xié)程切換實現(xiàn)詳解

    Python gevent協(xié)程切換實現(xiàn)詳解

    這篇文章主要介紹了Python gevent協(xié)程切換實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • pip和pygal的安裝實例教程

    pip和pygal的安裝實例教程

    這篇文章主要介紹了pip和pygal的安裝實例教程,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • python配置文件寫入過程詳解

    python配置文件寫入過程詳解

    這篇文章主要介紹了python配置文件寫入過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Python與Java交互出現(xiàn)亂碼的問題解決

    Python與Java交互出現(xiàn)亂碼的問題解決

    在現(xiàn)代軟件開發(fā)中,跨語言系統(tǒng)的集成已經(jīng)成為日常工作的一部分,特別是當Python和Java之間進行交互時,編碼問題往往會成為導致數(shù)據(jù)傳輸錯誤、亂碼以及難以調試的主要原因之一,下面我們來看看如何解決吧
    2025-05-05

最新評論

涡阳县| 安多县| 岳普湖县| 牡丹江市| 罗源县| 泗阳县| 二连浩特市| 太保市| 盐津县| 凤山市| 同心县| 灵宝市| 科尔| 蚌埠市| 邢台市| 仲巴县| 汤原县| 盐津县| 黄浦区| 惠安县| 鹰潭市| 涟源市| 金乡县| 阆中市| 林周县| 高青县| 云梦县| 蕲春县| 遵化市| 榆林市| 乌兰县| 永德县| 临江市| 徐水县| 中江县| 辽宁省| 申扎县| 思南县| 鹤岗市| 渝中区| 祥云县|