這篇文章主要介紹“Python如何刪除目錄下的相同文件”,在日常操作中,相信很多人在Python如何刪除目錄下的相同文件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python如何刪除目錄下的相同文件”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計、成都網(wǎng)站制作與策劃設(shè)計,灤州網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:灤州等地區(qū)。灤州做網(wǎng)站價格咨詢:028-86922220
# -*- coding: cp936 -*- import md5 import os from time import clock as now def getmd5(filename): file_txt = open(filename,'rb').read() m = md5.new(file_txt) return m.hexdigest() def main(): path = raw_input("path: ") all_md5=[] total_file=0 total_delete=0 start=now() for file in os.listdir(path): total_file += 1; real_path=os.path.join(path,file) if os.path.isfile(real_path) == True: filemd5=getmd5(real_path) if filemd5 in all_md5: total_delete += 1 print '刪除',file else: all_md5.append(filemd5) end = now() time_last = end - start print '文件總數(shù):',total_file print '刪除個數(shù):',total_delete print '耗時:',time_last,'秒' if __name__=='__main__': main()
上面的程序原理很簡單,就是依次讀取每個文件,計算md5,如果md5在md5列表不存在,就把這個md5加到md5列表里面去,如果存在的話,我們就認(rèn)為這個md5對應(yīng)的文件已經(jīng)出現(xiàn)過,這個圖片就是多余的,然后我們就可以把這個圖片刪除了。在這個文件夾下面有8674個文件,有31個是重復(fù)的,找到所有重復(fù)文件共耗時155.5秒。效率不算高,能不能進(jìn)行優(yōu)化呢?我分析了一下,我的程序里面有兩個功能比較耗時間,一個是計算每個文件的md5,這個占了大部分時間,還有就是在列表中查找md5是否存在,也比較費時間的。從這兩方面入手,我們可以進(jìn)一步優(yōu)化。
首先我想的是解決查找問題,或許我們可以對列表中的元素先排一下序,然后再去查找,但是列表是變化的,每次都排序的話效率就比較低了。我想的是利用字典進(jìn)行優(yōu)化。字典最顯著的特點是一個key對應(yīng)一個值我們可以把md5作為key,key對應(yīng)的值就不需要了,在變化的情況下字典的查找效率比序列效率高,因為序列是無序的,而字典是有序的,查找起來當(dāng)然更快。這樣我們只要判斷md5值是否在所有的key中就可以了。下面是改進(jìn)后的代碼:
# -*- coding: cp936 -*- import md5 import os from time import clock as now def getmd5(filename): file_txt = open(filename,'rb').read() m = md5.new(file_txt) return m.hexdigest() def main(): path = raw_input("path: ") all_md5={} total_file=0 total_delete=0 start=now() for file in os.listdir(path): total_file += 1; real_path=os.path.join(path,file) if os.path.isfile(real_path) == True: filemd5=getmd5(real_path) if filemd5 in all_md5.keys(): total_delete += 1 print '刪除',file else: all_md5[filemd5]='' end = now() time_last = end - start print '文件總數(shù):',total_file print '刪除個數(shù):',total_delete print '耗時:',time_last,'秒' if __name__=='__main__': main()
再看看運行截圖
從時間上看,確實比原來快了一點,但是還不理想。下面還要進(jìn)行優(yōu)化。還有什么可以優(yōu)化呢?md5!上面的程序,每個文件都要計算md5,非常費時間,是不是每個文件都需要計算md5呢?能不能想辦法減少md5的計算次數(shù)呢?我想到了一種方法:上面分析時我們提到,可以通過比較文件大小的方式來判斷圖片是否完全相同,速度快,但是這種方法是不準(zhǔn)確的,md5是準(zhǔn)確的,我們能不能把兩者結(jié)合一下?答案是肯定的。我們可以認(rèn)定:如果兩個文件完全相同,那么這兩個文件的大小和md5一定相同,如果兩個文件的大小不同,那么這兩個文件肯定不同!這樣的話,我們只需要先查看文件的大小是否存在在size字典中,如果不存在,就將它加入到size字典中,如果大小存在的話,這說明有至少兩張圖片大小相同,那么我們只要計算文件大小相同的文件的md5,如果md5相同,那么這兩個文件肯定完全一樣,我們可以刪除,如果md5不同,我們把它加到列表里面,避免重復(fù)計算md5.具體代碼實現(xiàn)如下:
# -*- coding: cp936 -*- import md5 import os from time import clock as now def getmd5(filename): file_txt = open(filename,'rb').read() m = md5.new(file_txt) return m.hexdigest() def main(): path = raw_input("path: ") all_md5 = {} all_size = {} total_file=0 total_delete=0 start=now() for file in os.listdir(path): total_file += 1 real_path=os.path.join(path,file) if os.path.isfile(real_path) == True: size = os.stat(real_path).st_size name_and_md5=[real_path,''] if size in all_size.keys(): new_md5 = getmd5(real_path) if all_size[size][1]=='': all_size[size][1]=getmd5(all_size[size][0]) if new_md5 in all_size[size]: print '刪除',file total_delete += 1 else: all_size[size].append(new_md5) else: all_size[size]=name_and_md5 end = now() time_last = end - start print '文件總數(shù):',total_file print '刪除個數(shù):',total_delete print '耗時:',time_last,'秒' if __name__=='__main__': main()
到此,關(guān)于“Python如何刪除目錄下的相同文件”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
分享文章:Python如何刪除目錄下的相同文件
路徑分享:http://weahome.cn/article/ghhegp.html