• 找出文件夹中的相同文件,并移动到指定文件夹中


    今天同事找我,说需要把多个文件夹内相同的文件拿出来放到一起,就顺手写了这个,有需要的可以自己看看。

    '''
    找出文件夹中的相同文件,并移动到指定文件夹中
    '''
    
    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并没有那么难,有问题在群里随时问我,群内含有不少的学习资料,大家可以一起讨论问题,共同进步。

  • 相关阅读:
    用Java开发第一个APP
    去除字符串空格并竖向排列
    并发容器 concurrentHashMap--1.7 更改
    java并发容器CopyOnWriteArrayList 使用场景和内部实现分析
    java非并发容器ArrayList 和 LinkedList 优缺点比较及其实现源码分析
    并发容器之CopyOnWriteArrayList分析
    单例模式
    [Android]知识总结一:Activity
    阿里巴巴fastjson的使用问题
    java跨域请求的方式
  • 原文地址:https://www.cnblogs.com/shuchongzeishuai/p/13852281.html
Copyright © 2020-2023  润新知