精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python實現刪除目錄下相同文件

開發 后端
算法是個很神奇的東西,不經意間用一下會有意想不到的收獲!上面的代碼還可以進一步優化,比如改進查找算法等,讀者有啥想法可以和我交流一下。換成C語言來實現可能會更快。

不要整天往腦袋里塞算法,要適時把算法拿出來,應用到實際開發中!

這兩天閑來無事在百度上淘了點圖片,不多,也就幾萬張吧,其中有不少美女圖片奧!哈哈!這里暫且不說圖片是怎么獲得的,咱聊聊得到圖片以后發生的事。

遇到的***個問題就是有些圖片沒有后綴名。在windows下,沒有后綴名的文件是不能正確被識別的,沒有預覽,打開時還要選擇打開方式,費勁!這個問題比較容易解決,給每個圖片加上后綴名就是了。沒有后綴名的圖片也不多,不到1000張吧,一張一張地改很麻煩,還好我是學計算機的,上午寫了個程序批量修改http://www.cnblogs.com/ma6174/archive/2012/05/04/2482378.html。這個問題就算解決了。接下來又遇到了一個新問題:圖片多了,難免出現重復的,有些圖片完全一樣,沒有必要都留著,我就想把所有的重復圖片都刪除。

 讓我們來分析一下這個問題:首先,文件個數非常多,手工查找是不現實的,再說,單憑我們肉眼,在幾千張圖片里面找到完全相同的難度也是很大的。如果不是圖片而是其他文檔,在不能預覽的情況下要正確區分是很困難的。所以要用程序實現。那么用程序怎么實現呢?根據什么判斷兩個文件完全相同呢?首先,根據文件名判斷是靠不住的,因為文件名可以被隨意更改,但文件內容不變。再說在同一個文件夾下面,也不可能出現兩個完全相同的文件名,操作系統不允許的。還有一種方法就是根據文件大小來判斷,這不失為一種好辦法,但是,文件大小相同的圖片可能不一樣。再說圖片一般都比較小,超過3M的基本沒有,大部分不夠1M,如果文件夾下面文件特別多,出現大小相同的的文件可能性是相當大的。所以單憑文件大小來比較不靠譜。還有一種方法是讀取每張圖片的內容,然后比較這個圖片的內容和其他圖片是否完全相同,如果內容相同那么這兩張圖片肯定是完全相同的。這種方法看起來是比較***的,讓我們來分析一下他的時空效率:首先每張圖片的內容都要和其他圖片進行比較,這就是一個二重循環,讀取的效率低,比較的效率更低,所有的都比較下來是非常費時的!內存方面,如果預先把所有圖片讀取到內存可以加快文件的比較效率,但是普通計算機的內存資源有限,如果圖片非常多,好幾個G的話,都讀到內存是不現實的。如果不把所有的文件讀取到內存,那么每比較一次之前就要先讀取文件內容,比較幾次就要讀取幾次,從硬盤讀取數據是比較慢的,這樣做顯然不合適。那么有沒有更好的方法呢?我冥思苦想,絞盡腦汁,***想到了md5。md5是什么?你不知道嗎?額,你火星了,抓緊時間duckduckgo吧!也許你會問,md5不是加密的嗎?和我們的問題有關系嗎?問得好!md5可以把任意長度的字符串進行加密后形成一個32的字符序列,包括數字和字母(大寫或小寫),因為字符串任何微小的變動都會導致md5序列改變,因此md5可以看作一個字符串的‘指紋’或者‘信息摘要’,因為md5字符串總共有3632個,所以兩個不同的字符串得到一個相同的md5概率是很小的,幾乎為0,同樣的道理,我們可以得到每個文件的md5,若干文件的md5相同的話就基本上可以肯定兩個文件是相同的,因為md5相同而文件不同的概率太小了,基本可以忽略,這樣我們就可以這樣做:得到每個文件的md5,通過比較md5是否相同我們就可以確定兩張圖片是否相同。下面是代碼實現,python的。

  1. # -*- coding: cp936 -*-  
  2. import md5  
  3. import os  
  4. from time import clock as now  
  5. def getmd5(filename):  
  6.     file_txt = open(filename,'rb').read()  
  7.     m = md5.new(file_txt)  
  8.     return m.hexdigest()  
  9. def main():  
  10.     path = raw_input("path: ")  
  11.     all_md5=[]  
  12.     total_file=0 
  13.     total_delete=0 
  14.     start=now()  
  15.     for file in os.listdir(path):  
  16.         total_file += 1;  
  17.         real_path=os.path.join(path,file)  
  18.         if os.path.isfile(real_path) == True:  
  19.             filemd5=getmd5(real_path)  
  20.             if filemd5 in all_md5:  
  21.                 total_delete += 1  
  22.                 print '刪除',file  
  23.             else:  
  24.                 all_md5.append(filemd5)  
  25.     end = now()  
  26.     time_last = end - start  
  27.     print '文件總數:',total_file  
  28.     print '刪除個數:',total_delete  
  29.     print '耗時:',time_last,'秒'  
  30.       
  31. if __name__=='__main__':   
  32.     main()   
  33.  

上面的程序原理很簡單,就是依次讀取每個文件,計算md5,如果md5在md5列表不存在,就把這個md5加到md5列表里面去,如果存在的話,我們就認為這個md5對應的文件已經出現過,這個圖片就是多余的,然后我們就可以把這個圖片刪除了。下面是程序的運行截圖

 

 我們可以看到,在這個文件夾下面有8674個文件,有31個是重復的,找到所有重復文件共耗時155.5秒。效率不算高,能不能進行優化呢?我分析了一下,我的程序里面有兩個功能比較耗時間,一個是計算每個文件的md5,這個占了大部分時間,還有就是在列表中查找md5是否存在,也比較費時間的。從這兩方面入手,我們可以進一步優化。

首先我想的是解決查找問題,或許我們可以對列表中的元素先排一下序,然后再去查找,但是列表是變化的,每次都排序的話效率就比較低了。我想的是利用字典進行優化。字典最顯著的特點是一個key對應一個值我們可以把md5作為key,key對應的值就不需要了,在變化的情況下字典的查找效率比序列效率高,因為序列是無序的,而字典是有序的,查找起來當然更快。這樣我們只要判斷md5值是否在所有的key中就可以了。下面是改進后的代碼:

  1. # -*- coding: cp936 -*-  
  2. import md5  
  3. import os  
  4. from time import clock as now  
  5. def getmd5(filename):  
  6.     file_txt = open(filename,'rb').read()  
  7.     m = md5.new(file_txt)  
  8.     return m.hexdigest()  
  9. def main():  
  10.     path = raw_input("path: ")  
  11.     all_md5={}  
  12.     total_file=0 
  13.     total_delete=0 
  14.     start=now()  
  15.     for file in os.listdir(path):  
  16.         total_file += 1;  
  17.         real_path=os.path.join(path,file)  
  18.         if os.path.isfile(real_path) == True:  
  19.             filemd5=getmd5(real_path)  
  20.             if filemd5 in all_md5.keys():  
  21.                 total_delete += 1  
  22.                 print '刪除',file  
  23.             else:  
  24.                 all_md5[filemd5]=''  
  25.     end = now()  
  26.     time_last = end - start  
  27.     print '文件總數:',total_file  
  28.     print '刪除個數:',total_delete  
  29.     print '耗時:',time_last,'秒'  
  30.       
  31. if __name__=='__main__':   
  32.     main()  

再看看運行截圖

 

從時間上看,確實比原來快了一點,但是還不理想。下面還要進行優化。還有什么可以優化呢?md5!上面的程序,每個文件都要計算md5,非常費時間,是不是每個文件都需要計算md5呢?能不能想辦法減少md5的計算次數呢?我想到了一種方法:上面分析時我們提到,可以通過比較文件大小的方式來判斷圖片是否完全相同,速度快,但是這種方法是不準確的,md5是準確的,我們能不能把兩者結合一下?答案是肯定的。我們可以認定:如果兩個文件完全相同,那么這兩個文件的大小和md5一定相同,如果兩個文件的大小不同,那么這兩個文件肯定不同!這樣的話,我們只需要先查看文件的大小是否存在在size字典中,如果不存在,就將它加入到size字典中,如果大小存在的話,這說明有至少兩張圖片大小相同,那么我們只要計算文件大小相同的文件的md5,如果md5相同,那么這兩個文件肯定完全一樣,我們可以刪除,如果md5不同,我們把它加到列表里面,避免重復計算md5.具體代碼實現如下:

  1. # -*- coding: cp936 -*-  
  2. import md5  
  3. import os  
  4. from time import clock as now  
  5. def getmd5(filename):  
  6.     file_txt = open(filename,'rb').read()  
  7.     m = md5.new(file_txt)  
  8.     return m.hexdigest()  
  9. def main():  
  10.     path = raw_input("path: ")  
  11.     all_md5 = {}  
  12.     all_size = {}  
  13.     total_file=0 
  14.     total_delete=0 
  15.     start=now()  
  16.     for file in os.listdir(path):  
  17.         total_file += 1  
  18.         real_path=os.path.join(path,file)  
  19.         if os.path.isfile(real_path) == True:  
  20.             size = os.stat(real_path).st_size  
  21.             name_and_md5=[real_path,'']  
  22.             if size in all_size.keys():  
  23.                 new_md5 = getmd5(real_path)  
  24.                 if all_size[size][1]=='':  
  25.                     all_size[size][1]=getmd5(all_size[size][0])  
  26.                 if new_md5 in all_size[size]:  
  27.                     print '刪除',file  
  28.                     total_delete += 1  
  29.                 else:  
  30.                     all_size[size].append(new_md5)  
  31.             else:  
  32.                 all_size[size]=name_and_md5  
  33.     end = now()  
  34.     time_last = end - start  
  35.     print '文件總數:',total_file  
  36.     print '刪除個數:',total_delete  
  37.     print '耗時:',time_last,'秒'  
  38.       
  39. if __name__=='__main__':   
  40.     main()  

時間效率怎樣呢?看下圖:

 

 只用了7.28秒!比前兩個效率提高了十幾倍!這個時間還可以接受

算法是個很神奇的東西,不經意間用一下會有意想不到的收獲!上面的代碼還可以進一步優化,比如改進查找算法等,讀者有啥想法可以和我交流一下。換成C語言來實現可能會更快。呵呵,我喜歡python的簡潔!

原文鏈接:http://www.cnblogs.com/ma6174/archive/2012/05/05/2484415.html

責任編輯:張偉 來源: ma6174的博客
相關推薦

2020-06-22 07:47:18

Linux系統磁盤

2017-06-09 13:51:42

Linux命令刪除文件

2023-12-30 08:34:32

開發apkUri

2009-12-08 12:06:03

linux當前目錄文件數

2012-12-28 14:28:26

Android開發

2013-10-10 13:05:46

Windows 7微軟更新

2009-09-28 10:28:04

Linux刪除目錄子目錄

2021-11-02 09:14:14

Windows 11操作系統微軟

2011-05-17 10:04:18

Python

2009-08-17 08:29:00

c#刪除指定文件

2013-04-03 12:57:01

Android開發讀寫assets目錄下

2011-02-25 11:06:45

Proftpf

2009-11-18 16:39:51

PHP遞歸刪除目錄

2009-08-17 07:58:00

C#刪除文件目錄

2016-11-15 09:27:37

Linux刪除文件

2021-02-16 10:57:34

C++ C 語言windows

2011-03-25 11:28:34

Cactirra目錄

2010-01-11 10:05:18

Linux刪除目錄

2024-12-06 15:11:34

Python文件夾目錄

2009-12-11 10:09:30

PHP INCLUDE
點贊
收藏

51CTO技術棧公眾號

国产乱子伦精品视频| 成人网在线视频| 国产小视频自拍| 91国产精品| 午夜精品久久久久久久99水蜜桃| 蜜桃免费一区二区三区| 97国产成人无码精品久久久| 今天的高清视频免费播放成人| 日韩大陆毛片av| 欧美成年人视频在线观看| 国产啊啊啊视频在线观看| 久久久久久99精品| 96久久精品| 中文字幕永久在线| 亚洲高清久久| 久久香蕉国产线看观看av| 亚洲精品女人久久久| 91精品麻豆| 色视频一区二区| 全黄性性激高免费视频| av在线三区| 久久尤物电影视频在线观看| 亚洲free性xxxx护士hd| 成人免费毛片视频| 亚洲国产网站| 欧美精品生活片| 亚洲精品视频网址| 蜜桃视频欧美| 精品久久久久久综合日本欧美| 日日噜噜夜夜狠狠| 黑人精品一区| 午夜婷婷国产麻豆精品| 国产成人精品免费看在线播放 | 欧美精品第一页| 欧美牲交a欧美牲交aⅴ免费真 | 国产精品流白浆视频| 久久久久久久久久免费视频| 亚洲综合色站| 爱福利视频一区| 在线看片中文字幕| 欧美精选一区二区三区| 日韩电影大全免费观看2023年上| 农村末发育av片一区二区| 日韩精品第二页| 欧亚洲嫩模精品一区三区| 免费一级特黄毛片| 青青草原国产在线| 亚洲卡通欧美制服中文| 亚洲欧洲免费无码| 黄色片在线免费看| 久久免费美女视频| 欧美自拍资源在线| 国产一级网站视频在线| 91蜜桃传媒精品久久久一区二区| 成人av免费电影| 亚洲第一页视频| 国产凹凸在线观看一区二区| 成人欧美一区二区| www.97av| 99re6这里只有精品视频在线观看| 97人人干人人| 二区三区在线视频| zzijzzij亚洲日本少妇熟睡| 国产精品免费一区二区三区在线观看 | 高清免费日韩| 四虎精品一区二区三区| 99re在线视频这里只有精品| 日本成人黄色免费看| 国产在线自天天| 国产精品每日更新| 久久久99精品视频| 国产高清自产拍av在线| 一本大道久久a久久精二百| 浮妇高潮喷白浆视频| 国产v日韩v欧美v| 一本久久精品一区二区| 日韩av在线中文| 伊色综合久久之综合久久| 欧美成人a视频| 不卡一区二区在线观看| 欧美色图激情小说| 免费不卡在线观看av| 欧美一级高潮片| 久久国产福利| 亚洲在线视频观看| 天天操天天干天天| 国产精品国产三级国产aⅴ入口| 熟妇熟女乱妇乱女网站| 爱福利在线视频| 欧美亚洲综合色| 原创真实夫妻啪啪av| 欧美电影在线观看完整版| 亚洲性日韩精品一区二区| 天堂av免费在线| 亚洲激情午夜| 国产精品视频1区| 亚洲精品久久久狠狠狠爱| 91久色porny| 91制片厂免费观看| 欧美成人免费电影| 日韩欧美第一区| 日本二区在线观看| 国内自拍视频一区二区三区| 欧美怡红院视频一区二区三区| 中文人妻熟女乱又乱精品| 大桥未久av一区二区三区中文| 欧美激情第六页| 亚洲wwwww| 欧美日韩aaaaa| 黑人巨大精品欧美| 欧美日韩中文| 国产精品丝袜高跟| 日本中文字幕一区二区有码在线| 亚洲欧美日韩一区二区 | 久久精品国产网站| 狠狠色综合一区二区| 黄色av电影在线观看| 色综合久久久久| 在线xxxxx| 伊人色**天天综合婷婷| 国产精品日韩精品| 美国成人毛片| 欧美视频在线观看免费网址| 久久精品无码一区二区三区毛片 | 91在线国产福利| 久久这里只有精品8| 四虎国产精品免费久久| 亚洲图片欧洲图片av| 久久久久久91亚洲精品中文字幕| 国产大陆精品国产| 精品久久免费观看| 国产精品久久久久77777丨| 亚洲美女av电影| 天天操天天操天天操天天| 处破女av一区二区| 999久久欧美人妻一区二区| 综合欧美精品| 久久久久www| 国产精品一级二级| 亚洲天堂2016| 在线观看免费视频污| 999国产精品视频| 国产欧美日韩高清| 在线看黄色av| 在线不卡免费av| 日韩激情综合网| 狠狠网亚洲精品| 强开小嫩苞一区二区三区网站| 日韩有码欧美| 欧美成人手机在线| 超碰福利在线观看| 亚洲午夜私人影院| 国产一级二级在线观看| 性欧美长视频| 亚洲色图自拍| 久久天堂久久| 97视频在线观看成人| 无码国产精品一区二区色情男同| 欧美性猛交xxx| 成人在线一级片| 另类成人小视频在线| 中文字幕在线观看一区二区三区| 欧洲精品久久久久毛片完整版| www.日韩不卡电影av| 99久久免费国产精精品| 夜色激情一区二区| 亚洲成人日韩在线| 青青草伊人久久| 91制片厂免费观看| 成人午夜三级| 欧洲一区二区视频| 永久免费av在线| 欧美成人性福生活免费看| 男人的天堂一区二区| 久久奇米777| 视频区 图片区 小说区| 一区二区高清| 亚洲午夜精品久久久中文影院av| 欧美激情精品| 欧美中文在线观看| fc2ppv国产精品久久| 亚洲精品久久久久中文字幕欢迎你| 国产精品美女久久久久av爽| 中文成人综合网| 无码人妻少妇色欲av一区二区| 在线一区免费观看| 中国一区二区三区| 特黄特色欧美大片| 91免费人成网站在线观看18| 久草在线资源福利站| 色偷偷88888欧美精品久久久| 亚洲老妇色熟女老太| 91久久久免费一区二区| 久久久久久久久99| 欧美国产精品久久| 一级黄色免费视频| 麻豆精品视频在线观看视频| 福利在线一区二区| 久久国产电影| 精品国产中文字幕| 久久久久久久久成人| 国产精品99久久久久久白浆小说| 黄色小说在线播放| 日韩中文字幕在线视频播放| 少妇又色又爽又黄的视频| 欧美群妇大交群中文字幕| 黄色在线免费观看| 亚洲电影激情视频网站| 手机av在线看| 日本一区二区三区dvd视频在线| 亚洲欧美日韩色| 国产一区二区导航在线播放| 在线看的黄色网址| 亚洲在线一区| 欧美二区在线视频| 欧美日韩精选| av电影一区二区三区| 成人看的视频| 欧美日韩亚洲免费| 老牛国内精品亚洲成av人片| 亚洲综合中文字幕在线| 欧美爱爱视频| 国产精品视频中文字幕91| 中国字幕a在线看韩国电影| 欧美激情中文字幕乱码免费| 成人在线视频亚洲| 久久精品国产清自在天天线| aⅴ在线视频男人的天堂| 亚洲精品视频播放| 婷婷亚洲一区二区三区| 337p日本欧洲亚洲大胆精品| av在线免费在线观看| 欧美精选在线播放| 伊人色综合久久久| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产精品自拍99| 精品福利免费观看| 日韩xxx高潮hd| 亚洲电影一区二区| 国产成人精品一区二三区| 亚洲午夜三级在线| 日韩成人高清视频| 婷婷久久综合九色综合绿巨人| 日本少妇裸体做爰| 天天影视色香欲综合网老头| 日本三级理论片| 韩曰欧美视频免费观看| 免费在线观看一级片| 亚洲免费看黄网站| 久久久久久激情| 亚洲成人av免费| 人妻 日韩精品 中文字幕| 色婷婷综合五月| 在线免费av片| 欧美一二三区在线观看| 国产成人无码www免费视频播放| 亚洲成人网在线| 日本国产在线| 最近免费中文字幕视频2019| 蜜桃视频在线观看www社区 | av亚洲一区| 亚洲va久久久噜噜噜| 视频二区欧美毛片免费观看| 国产伦一区二区三区色一情| 日韩中出av| 亚洲欧美日韩精品综合在线观看| 久久中文视频| 欧美大黑帍在线播放| 夜夜爽av福利精品导航| 成人性生生活性生交12| 黄色资源网久久资源365| 日本一级大毛片a一| 2017欧美狠狠色| 免费在线观看黄色小视频| 亚洲综合色在线| 麻豆成人免费视频| 在线不卡欧美精品一区二区三区| 六月丁香色婷婷| 在线观看久久av| 日本高清在线观看| 欧美在线视频一二三| 成人在线日韩| 久久大香伊蕉在人线观看热2| 欧美一二区在线观看| 99久久99久久精品| 久久综合婷婷| 中国特级黄色片| 国产欧美一区二区三区沐欲| 九九热这里有精品视频| 日韩欧美一区视频| 国产同性人妖ts口直男| 日韩电影大片中文字幕| 国产素人视频在线观看| 日本亚洲欧美三级| 久久久久九九精品影院| 日韩高清av| 在线亚洲自拍| 国产香蕉精品视频| 亚洲视频 欧洲视频| 日韩不卡高清视频| 亚洲第一黄色网| 黄色av免费在线| 国产精品久久99久久| 国偷自产视频一区二区久| 亚洲欧美日产图| 玖玖玖国产精品| 亚洲天堂资源在线| 一区二区三区免费观看| 亚洲综合精品在线| 亚洲日韩第一页| 久久久男人天堂| 国产精品久久久久久久天堂第1集| 日本不卡二三区| 99热成人精品热久久66| 成人精品在线视频观看| 免费看特级毛片| 欧美午夜一区二区三区| 全部免费毛片在线播放网站| 久久久久亚洲精品| 日韩精品中文字幕一区二区| 制服国产精品| 久久99精品久久只有精品| 亚洲国产日韩一区无码精品久久久| 天天综合日日夜夜精品| 欧美一区二区黄片| 欧美激情影音先锋| 玖玖玖电影综合影院| 中文字幕免费在线不卡| 男人的天堂亚洲一区| 极品蜜桃臀肥臀-x88av| 在线亚洲免费视频| 国产中文字幕在线播放| 国产成人精品日本亚洲| 少妇久久久久| 凹凸国产熟女精品视频| 2022国产精品视频| 69亚洲精品久久久蜜桃小说| 国产丝袜一区视频在线观看| 欧洲一区精品| 欧美区高清在线| 午夜在线精品| 亚洲精品国产91| 欧美丝袜自拍制服另类| 欧洲不卡视频| 亚洲wwwav| 欧美日本二区| 网站免费在线观看| 黑丝美女久久久| 国产黄色免费在线观看| 国产精品久久久久久久一区探花| 欧美一区二区性| 成年人三级黄色片| 亚洲男同性恋视频| 亚洲精品综合网| 秋霞av国产精品一区| 国产成人影院| 青青草久久伊人| 亚洲一区二区精品3399| 天堂av在线7| 国产精品久久久久aaaa九色| 欧美独立站高清久久| 国产精品久久久久野外| 亚洲成人免费在线观看| 天堂av在线免费观看| 国产精品一区二区久久久久| 香蕉国产精品| 污污污www精品国产网站| 日本精品视频一区二区| 免费在线午夜视频| 国产精品久久久久久久小唯西川| 在线亚洲观看| av黄色免费在线观看| 精品国产百合女同互慰| 中文在线最新版地址| 一区二区视频在线播放| 国产白丝网站精品污在线入口| 黄色片中文字幕| 久久成人精品一区二区三区| 久久久伦理片| 中文字幕22页| 天天综合天天做天天综合| 999国产在线视频| 成人欧美一区二区| 日本成人中文字幕| 日韩成人免费在线观看| 日韩在线视频一区| 久久亚州av| 中文 日韩 欧美| 色94色欧美sute亚洲线路二| 在线heyzo| 亚洲精品高清国产一线久久| 成人做爰69片免费看网站| 亚洲精品一区二区二区| 久久久视频精品| 99久久.com| 日本黄色网址大全| 日韩一区二区三区免费看 | 色婷婷综合视频在线观看| 手机av在线播放| 亚洲图色在线|