成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Python如何刪除目錄下的相同文件

這篇文章主要介紹“Python如何刪除目錄下的相同文件”,在日常操作中,相信很多人在Python如何刪除目錄下的相同文件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python如何刪除目錄下的相同文件”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作與策劃設(shè)計(jì),灤州網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:灤州等地區(qū)。灤州做網(wǎng)站價(jià)格咨詢: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 '刪除個(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)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

本文名稱:Python如何刪除目錄下的相同文件
瀏覽地址:http://jinyejixie.com/article18/ghhegp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、虛擬主機(jī)、標(biāo)簽優(yōu)化、網(wǎng)站營銷、關(guān)鍵詞優(yōu)化、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營
新田县| 芮城县| 嘉义市| 江达县| 高安市| 方城县| 重庆市| 肃宁县| 西乌珠穆沁旗| 南部县| 湟源县| 阳江市| 宜城市| 宁化县| 化隆| 惠水县| 衢州市| 正镶白旗| 香河县| 商丘市| 离岛区| 东阿县| 紫云| 麻江县| 任丘市| 鱼台县| 南川市| 金山区| 宁安市| 信宜市| 惠来县| 盈江县| 台江县| 兴宁市| 贺州市| 张家港市| 安溪县| 新闻| 林周县| 招远市| 天镇县|