python批量移动文件并进行MD5去重

1.最近下了一堆文件,但是都是分文件夹存的。例:

 

 python批量移动文件并进行MD5去重

想手动移动到一起实在太麻烦了,于是写了个脚本,顺便百度了一份其他大佬的MD5去重

思路:

1.遍历当前及下层文件夹获取文件,写入到另一文件夹,如果重名则移动时更名。

2.完成后进行去重

# -*- coding:utf-8 -*-
import os
import shutil
import hashlib
import datetime

#移动文件到指定文件夹
def movefile(rootdir,des_path):
    #获取目录下文件名清单
    list=os.listdir(rootdir)
    for i in range(0,len(list)):     #遍历目录下的所有文件夹
        path=os.path.join(rootdir,list[i])   
        if os.path.isdir(path):         # 判断是否为文件夹
            for item in os.listdir(path): # 遍历该文件夹中的所有文件
                if os.path.isdir(item): # 跳过第三层文件夹
                    print("跳过多级目录")
                    continue
                dirname=os.path.join(rootdir,list[i]) # 将根目录与文件夹名连接起来,获取文件目录
                full_path=os.path.join(dirname,item) # 将文件目录与文件名连接起来,形成原来完整路径
                print(full_path)
                # 如果有重名文件,就加上一个数字
                if os.path.exists(os.path.join(des_path, item)):
                    print("文件已存在,重命名")
                    for j in range(1, 100):
                        if not os.path.exists(os.path.join(des_path,str(j) + item)):
                            rename = str(j) + item
                            break
                    ren_path = os.path.join(des_path,rename)
                    shutil.move(full_path,ren_path)  # 移动文件到目标路径并更名   
                else:                   
                    shutil.move(full_path,des_path)  # 移动文件到目标路径
                    print(full_path)
        else:
            print("不为文件夹,尝试直接拷贝")
            print(path)
            # 如果有重名文件,就加上一个数字  "/*.[jp][pn]g"
            if os.path.exists(os.path.join(des_path, list[i])):
                for j in range(1, 100):
                    if not os.path.exists(os.path.join(des_path,list[i] + str(j))):
                        rename = str(j)+list[i]
                        break
                shutil.move(path,os.path.join(des_path,rename))
            else:
                shutil.move(path,des_path)  # 移动文件到目标路径

# MD5去重
def getmd5(filename):
    file_txt = open(filename, 'rb').read()
    m = hashlib.md5(file_txt)
    return m.hexdigest()

def MD5RemoveFile(filepath):  
    if os.path.isdir(filepath):    
        all_md5 = []
        total_file = 0
        total_delete = 0
        for file in os.listdir(filepath):
            total_file += 1
            real_path = os.path.join(filepath, file)
            if os.path.isfile(real_path) == True:
                filemd5 = getmd5(real_path)
                if filemd5 in all_md5:
                    total_delete += 1
                    os.remove(real_path)
                else:
                    all_md5.append(filemd5)          
        print (u'文件总数:', total_file)
        print (u'删除个数:', total_delete)
    else:
        print("检查目录不为文件夹")
   
if __name__ == '__main__':
    start = datetime.datetime.now()
    rootdir=input("请输入想移动文件的目录 注:为文件的上层目录")
    des_path=input("请输入想移动到的目录")
    
    if not os.path.exists(des_path):
        print("移动目录不存在,自动创建")
        os.makedirs(des_path)
    if not os.path.exists(rootdir):
        print("原始目录不存在")
    else:
        movefile(rootdir,des_path)
    print("移动完成")
    print("")

    print("执行MD5查重")
    MD5RemoveFile(des_path)
    end = datetime.datetime.now()
    time_last = end - start
    print (u'耗时:', time_last, u'秒')

注:不检查第三层目录

上一篇:5.1 DES加密解密 -python 实现


下一篇:C#与java加密DES/CBC方式加解密一致性实测可用