溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2022-06-01 14:47:41 來源:億速云 閱讀:190 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“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í)用的文章!

向AI問一下細(xì)節(jié)

免責(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)容。

AI