您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python如何刪除目錄下的相同文件”,在日常操作中,相信很多人在Python如何刪除目錄下的相同文件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python如何刪除目錄下的相同文件”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
# -*- 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 '刪除個(gè)數(shù):',total_delete print '耗時(shí):',time_last,'秒' if __name__=='__main__': main()
上面的程序原理很簡單,就是依次讀取每個(gè)文件,計(jì)算md5,如果md5在md5列表不存在,就把這個(gè)md5加到md5列表里面去,如果存在的話,我們就認(rèn)為這個(gè)md5對應(yīng)的文件已經(jīng)出現(xiàn)過,這個(gè)圖片就是多余的,然后我們就可以把這個(gè)圖片刪除了。在這個(gè)文件夾下面有8674個(gè)文件,有31個(gè)是重復(fù)的,找到所有重復(fù)文件共耗時(shí)155.5秒。效率不算高,能不能進(jìn)行優(yōu)化呢?我分析了一下,我的程序里面有兩個(gè)功能比較耗時(shí)間,一個(gè)是計(jì)算每個(gè)文件的md5,這個(gè)占了大部分時(shí)間,還有就是在列表中查找md5是否存在,也比較費(fèi)時(shí)間的。從這兩方面入手,我們可以進(jìn)一步優(yōu)化。
首先我想的是解決查找問題,或許我們可以對列表中的元素先排一下序,然后再去查找,但是列表是變化的,每次都排序的話效率就比較低了。我想的是利用字典進(jìn)行優(yōu)化。字典最顯著的特點(diǎn)是一個(gè)key對應(yīng)一個(gè)值我們可以把md5作為key,key對應(yīng)的值就不需要了,在變化的情況下字典的查找效率比序列效率高,因?yàn)樾蛄惺菬o序的,而字典是有序的,查找起來當(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 '刪除個(gè)數(shù):',total_delete print '耗時(shí):',time_last,'秒' if __name__=='__main__': main()
再看看運(yùn)行截圖
從時(shí)間上看,確實(shí)比原來快了一點(diǎn),但是還不理想。下面還要進(jìn)行優(yōu)化。還有什么可以優(yōu)化呢?md5!上面的程序,每個(gè)文件都要計(jì)算md5,非常費(fèi)時(shí)間,是不是每個(gè)文件都需要計(jì)算md5呢?能不能想辦法減少md5的計(jì)算次數(shù)呢?我想到了一種方法:上面分析時(shí)我們提到,可以通過比較文件大小的方式來判斷圖片是否完全相同,速度快,但是這種方法是不準(zhǔn)確的,md5是準(zhǔn)確的,我們能不能把兩者結(jié)合一下?答案是肯定的。我們可以認(rèn)定:如果兩個(gè)文件完全相同,那么這兩個(gè)文件的大小和md5一定相同,如果兩個(gè)文件的大小不同,那么這兩個(gè)文件肯定不同!這樣的話,我們只需要先查看文件的大小是否存在在size字典中,如果不存在,就將它加入到size字典中,如果大小存在的話,這說明有至少兩張圖片大小相同,那么我們只要計(jì)算文件大小相同的文件的md5,如果md5相同,那么這兩個(gè)文件肯定完全一樣,我們可以刪除,如果md5不同,我們把它加到列表里面,避免重復(fù)計(jì)算md5.具體代碼實(shí)現(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 '刪除個(gè)數(shù):',total_delete print '耗時(shí):',time_last,'秒' if __name__=='__main__': main()
到此,關(guān)于“Python如何刪除目錄下的相同文件”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。