用python实现指定文件及文件夹批量移动至指定位置,按文件名进行文件分类

一、功能概述

最近刚好碰到分类整理文件夹的需求,我这个python小白就学习了一下,在这里分享一下成果~

主要功能是实现把 文件名中有相同部分 的这类文件移动至指定文件夹中,可以根据自己的分类需要,按照文件名相同的部分生成文件夹,把具有同名部分的文件都移动进去

简单解释一下我的需求:文件夹下有大量待整理的文件或者文件夹
可以按照需要在指定路径生成需要的文件夹,把符合要求的所有文件移动至生成的文件夹。本文主要是针对文件名匹配应该去往的文件夹。
编号中断不影响文件的分类,不然新建的文件夹就不能指示里面有哪些编号的文件了
下面还有例子可以康康。

二、使用步骤

1.引入库

代码如下:

import os
import shutil
import re
import math

2.新建文件夹

代码如下:

for root0, dir0, files0 in os.walk(path1):
    len_subdir = len(dir0)
    filename = str(dir0).split("_")[-2]
    for number in range(1, math.ceil(len_subdir/10)+2):
        subdir_id = "{:0>3d}".format(number)
        subdir_str = filename + "_" + "sub" + subdir_id  #新建文件夹的名字
        # print("新建文件夹:", subdir_str)
        subdir_path = os.path.join(path2, subdir_str)  # 新建文件夹的路径
        if not os.path.exists(subdir_path):  # 若不存在则新建
            os.makedirs(subdir_path)
    break

解释一下上面的代码~~

从文件名字中提取你想要命名新建文件夹的部分,在这个代码中,我想要提取path1路径下文件夹名字中的某些部分作为新建文件夹的名字,举个例子:
path1 路径下的文件夹名字是编号为:

“K_L_1_0001-0001_001” ——“K_L_1_0001-0001_100”,

我想要新建文件夹名字为:

“0001-0001_sub001”——“0001-0001_sub010”

目的是把"K_L_1_0001-0001_001" ——"K_L_1_0001-0001_100"这100个文件按编号分类成

“K_L_1_0001-0001_001” ——“K_L_1_0001-0001_010” 移动至 “0001-0001_sub001”
 “K_L_1_0001-0001_011” ——“K_L_1_0001-0001_020” 移动至 “0001-0001_sub002”
 “K_L_1_0001-0001_031” ——“K_L_1_0001-0001_030” 移动至 “0001-0001_sub003”
 … …


如果编号是断开的也不能影响这个分类,不然就会乱掉,不知道文件夹里都是编号多少的。
所以这里的filename是提取的0001-0001这部分,subdir_id提取的是001,002,003…这部分,“len_subdir/10”是因为10个文件是移动至一个文件夹下的,如果就只是len_subdir就会有多少编号生成多少文件夹。比如100个就生成100个,但我这里只要10个新建文件夹。

3.分配文件,移动归类

代码如下:

for i in range(len(file_list)):
    if os.path.isfile(path1):
        pass
    if os.path.isdir(path1):
        old_file_path = os.path.join(path1, file_list[i])   # 指定要移动的路径:具体至文件夹名
        file_name_number = re.findall(r"\d+", file_list[i])[3]   # 提取文件名称中匹配要用的信息
        print(old_file_path)
        file_name_number = int(file_name_number)
        if file_name_number % 10 == 0:
            find_id = "{:0>3d}".format(file_name_number//10)
        else:
            find_id = "{:0>3d}".format(file_name_number//10 + 1)
        find_path = filename + '_' + 'sub' + find_id  # 完整的匹配信息
        new_file_path = os.path.join(path2, find_path)  # 指定移动至的路径:具体至文件夹名所在
        print("new_file_path:", new_file_path)
        shutil.move(old_file_path, new_file_path)  # 移动

这里就用正则表达式找一下要移动的文件就可以啦,然后就是指定一些匹配的规则就ok啦。特别注意一下,我因为只需要移动文件所以写了if判断,如果文件和文件夹都要移动,就不需要if判断啦!