用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判断啦!