由於自己的手機經常備份,備份后原來的圖片視頻沒有刪除,下次再備份的時候移動硬盤上又多了很多重復圖片,於是想着能不能用提取MD5校驗碼的方式識別出重復的文件,然后處理下硬盤里已經重復的內容.
考慮到最近在學python,於是通過上網查資料和內容,借很多大牛的輪子來試了一下,搞了兩個晚上,終於算是階段性完成,能達到目標的方法.主要難點有三個:
- 獲取文件的MD5碼;
- 不能更改文件的后綴名(例如原來是jpg的保留jpg,MP4的保留MP4);
- 遍歷目標文件夾內所有文件;
不多說了,上代碼,各位如有適合請拿去不謝.如有幫助,請記得留言,謝謝.
1 # !/usr/bin/env python37 2 # -*- coding: utf-8 -*- 3 # @File : renamefile.py 4 # @Author: Frank 5 # @Date : 2018-09-22 6 7 import hashlib 8 import os 9 import time 10 11 # 1.獲取文件MD5值 12 def get_md5(file_name,path): 13 with open(os.path.join(path,file_name),'rb') as f: 14 md5obj = hashlib.md5() 15 md5obj.update(f.read()) 16 hash = md5obj.hexdigest() 17 #print(hash,type(hash)) 18 return hash 19 20 #2.找出當前的文件的后綴名 21 def file_type(file): 22 filename = file.split('.')[0] 23 filetype = file.split('.')[-1] 24 #print(filename,filetype) 25 return filetype 26 27 28 #3.主函數:查找目標目錄下的所有文件,並使用MD5值及后綴名重命名當前文件 29 def main(path): 30 winerror = [] 31 for root,dirlist,filelist in os.walk(path): 32 for file in filelist: 33 newname = '{0}.{1}'.format(get_md5(file,path), file_type(file)) 34 print(newname) 35 try: 36 if os.path.join(path,newname) == os.path.join(path,file): 37 pass 38 else: 39 print('Now Renaming:', file, 'To', newname) 40 os.rename(os.path.join(path,file),os.path.join(path,newname)) 41 except WindowsError: 42 nickname = '{0}.{1}'.format(str(len(winerror)),file_type(file)) 43 print('WindowsError for:',file, 'Renaming to:', nickname) 44 winerror.append(file) 45 os.rename(os.path.join(path,file),os.path.join(path,nickname)) 46 print(winerror) 47 print(len(winerror)) 48 49 50 51 #4.執行 52 path = r'D:\iPhoneshowdup\nameduplicate' 53 if __name__ == '__main__': 54 starttime = time.time() 55 main(path) 56 endtime = time.time() 57 usetime = endtime - starttime 58 print('總計用時:', usetime, 's')