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

浙公网安备 33010602011771号