python之讀取文件的MD5碼並重命名文件


由於自己的手機經常備份,備份后原來的圖片視頻沒有刪除,下次再備份的時候移動硬盤上又多了很多重復圖片,於是想着能不能用提取MD5校驗碼的方式識別出重復的文件,然后處理下硬盤里已經重復的內容.

考慮到最近在學python,於是通過上網查資料和內容,借很多大牛的輪子來試了一下,搞了兩個晚上,終於算是階段性完成,能達到目標的方法.主要難點有三個:

  1. 獲取文件的MD5碼;
  2. 不能更改文件的后綴名(例如原來是jpg的保留jpg,MP4的保留MP4);
  3. 遍歷目標文件夾內所有文件;

不多說了,上代碼,各位如有適合請拿去不謝.如有幫助,請記得留言,謝謝.

 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')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM