今天同事找我,说需要把多个文件夹内相同的文件拿出来放到一起,就顺手写了这个,有需要的可以自己看看。
''' 找出文件夹中的相同文件,并移动到指定文件夹中 ''' 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并没有那么难,有问题在群里随时问我,群内含有不少的学习资料,大家可以一起讨论问题,共同进步。