找出資料夾中的相同檔案,並移動到指定資料夾中
阿新 • • 發佈:2020-10-21
今天同事找我,說需要把多個資料夾內相同的檔案拿出來放到一起,就順手寫了這個,有需要的可以自己看看。
''' 找出資料夾中的相同檔案,並移動到指定資料夾中 ''' import hashlib import os,shutil def md5_vaule(dir): hasher = hashlib.md5() afile = open(dir, 'rb') buf = afile.read() a = hasher.update(buf) return str(hasher.hexdigest()) def file_name(file_dir): all =[] for root, dirs, files in os.walk(file_dir): tmp = [] # print('root_dir:', root) # 當前目錄路徑 # print('sub_dirs:', dirs) # 當前路徑下所有子目錄 # print('files:', files) # 當前路徑下所有非目錄子檔案 for i in files: tmp.append(root+"\\"+i) for j in tmp: all.append(j) return all def need_del(all_md5_in): all_md5_no_repeat = list(set(all_md5_in)) all_md5_no_repeat.sort(key=all_md5_in.index) need_del_index = [] for temp in all_md5_no_repeat: flag = 0 list_index = [] for n in range(all_md5_in.count(temp)): sec = flag flag = all_md5_in[flag:].index(temp) list_index.append(flag + sec) flag = list_index[-1:][0] + 1 for k in range(1, len(list_index)): need_del_index.append(list_index[k]) return need_del_index def move_file(orgfile, newpath): shutil.move(orgfile, newpath) def new_folder_create(in_del_folder, in_origl_folder): # 將重複檔案移動到指定資料夾,為防止出現檔名相同情況,後面會補上檔案原所在路徑 tmp1 = in_origl_folder.split(".") tmp2 = tmp1[-2].split(":") res_path = in_del_folder + tmp2[-1] os.makedirs(res_path) return res_path def all_file_and_md5(filename, filemd5): # 顯示所有檔案及其對應的md5 for i in range(len(filename)): res=filename[i]+" "+filemd5[i] print(res) def how_much_repeat(all_in): # 找出有多少相同的檔案 all_md5_set = list(set(all_in)) all_md5_set.sort(key = all_in.index) # for k in all_md5_set: # print(k) return len(all_in)-len(all_md5_set) if __name__ == '__main__': file_names = file_name("D:\\重複") # 要處理的資料夾路徑 del_folder = "D:\\重複del" # 將重複的檔案拷到此路徑下,為防止出現檔名相同情況,後面會補上檔案原所在路徑 all_md5 = [] file_names_beifen = [] all_md5_beifen = [] for i in file_names: all_md5.append(md5_vaule(i)) file_names_beifen.append(i) all_md5_beifen.append(md5_vaule(i)) # all_file_and_md5(file_names,all_md5) # 顯示所有檔案及其對應的md5 print("有多少重複 ", how_much_repeat(all_md5)) # 找出有多少相同的檔案 need_del_file = need_del(all_md5) # 找出需要刪除的檔案在原資料夾陣列中的位置(下標) print("重複檔案如下:") for j in need_del_file: # 將重複的檔案移動到指定資料夾中 print(file_names[j]) new_folder = new_folder_create(del_folder, file_names[j]) move_file(file_names[j], new_folder)
為了可以給大家提出更多的學習建議,這是我建立的Python學習圈子:1156465813。在彼此的溝通可以我們可以得到很多學習經驗,學習始終靠自己,當你掌握了一個好的學習方法,系統的學習方式,你會發現其實學習Python並沒有那麼難,有問題在群裡隨時問我,群內含有不少的學習資料,大家可以一起討論問題,共同進步。