目录
1、需求背景
在工作中,经常会遇到在文件夹里面找一些文件的情况,有时候需要找很多层的目录或者文件比较多,需要都找出来(比如在测试文件下的某个项目里面找到所有的world文档),于是想着自己做一个小工具来完成这样操作。
2、需求说明
一个目录A下面有多层目录,要求在目录A中提取出该目录下所以目录中的指定文件,提取后,需要拷贝到指定的文件夹中,然后发现重名再修改,并且发现重名文件后自动修改名称为XXX(1)
3、设计思路
3.1 读取文件夹,将符合条件的文档位置(名称)取出来存放在列表里面
3.2 处理列表,将列表信息内的文件名提取出来
3.3 检查重复的文件名,并给与重复的文件名重命名
3.4 将3.1查找出来的文件拷贝并按照重命名后的名称到新的文件夹下面
4、实现过程
首先去完成思路3.1的逻辑
def check_if_dir(filepath):
temp_list = os.listdir(filepath)
# print(temp_list) #文件夹名称(仅名字)集合
for temp_list_each in temp_list:
pathName = filepath + '/' + temp_list_each
if os.path.isfile(pathName):
if os.path.splitext(pathName)[-1] == '.txt':
path_read.append(pathName)
else:
continue
else:
check_if_dir(pathName)
接下来进行3.2逻辑的处理了
b = [] #文件名的列表(包含后缀)
c = [] #文件名列表(不包含后缀)
for i in path_read:
list_v =re.findall('.+/(.*)$', i) #提取/后面的信息
b.append(list_v[0])
for i in b:
list_v1 = re.findall('(.*?).txt', i) #提取‘.txt’前面的信息
c.append(list_v1[0])
然后进行3.3逻辑的实现
def rename_duplicate(list):
new_list=[v + str(list[:i].count(v) + 1) if list.count(v) > 1 else v for i, v in enumerate(list)]
return new_list
renamed_list=rename_duplicate(c)
# 将截取并重命名的字符串加上后缀名
New_r_l = [] #新的加完后缀名的列表
for i in renamed_list:
r_l = i+'.txt'
New_r_l.append(r_l)
最后实现3.4逻辑
s=0 # 记录新的列表下标
for i in path_read:
ads = New_path+New_r_l[s]
shutil.copy(i, ads)
print(i+'拷贝成功...')
s += 1
以上便实现了这个小工具的功能,能力有限,做的比较粗糙,欢迎给出中肯建议,后期也会不断完善。
测试
执行结果:
开始执行操作.......
D:\A/B/D/测试文本.txt拷贝成功...
D:\A/B/E/测试文本.txt拷贝成功...
D:\A/B/E/第三测试文本.txt拷贝成功...
D:\A/B/E/第二测试文本.txt拷贝成功...
D:\A/B/测试文本.txt拷贝成功...
D:\A/C/F/G/测试文本.txt拷贝成功...
D:\A/C/F/测试文本.txt拷贝成功...
D:\A/C/F/第三测试文本.txt拷贝成功...
D:\A/C/测试文本.txt拷贝成功...
D:\A/C/第三测试文本.txt拷贝成功...
D:\A/测试文本.txt拷贝成功...
D:\A/第三测试文本.txt拷贝成功...
D:\A/第二测试文本.txt拷贝成功...
执行成功,拷贝的文件已经存放在D:\testA/里面了
经过测试 目前已经满足基本需求,后续会继续不断完善
完整代码
import os,re,time
import shutil #shutil模块提供了大量的文件的高级操作。
path = 'D:\A' # 此处填写需要处理的文件夹路径
New_path = 'D:\\testA/' # 此处填写获取的文件保存地址(拷贝到的指定的目录)!!!!注意格式!!!!
path_read=[] # 所有指定文件的具体地址列表
#newname = []
print('开始执行操作.......')
'''
将所需要的文件位置信息以列表的形式保存下来
'''
def check_if_dir(filepath):
temp_list = os.listdir(filepath)
# print(temp_list) #文件夹名称(仅名字)集合
for temp_list_each in temp_list:
pathName = filepath + '/' + temp_list_each
if os.path.isfile(pathName):
if os.path.splitext(pathName)[-1] == '.txt':
path_read.append(pathName)
else:
continue
else:
check_if_dir(pathName)
check_if_dir(path)
# print(path_read) #测试
b = [] #文件名的列表(包含后缀)
c=[] #文件名列表(不包含后缀)
for i in path_read:
list_v =re.findall('.+/(.*)$', i)
b.append(list_v[0])
for i in b:
# list_v1=re.findall('(^.+/).*?', i)
# list_v1=re.findall('^.+\.',i)
list_v1 = re.findall('(.*?).txt', i)
c.append(list_v1[0])
# print(b) #测试
# print(c) #测试
def rename_duplicate(list, print_result=False):
new_list=[v + str(list[:i].count(v) + 1) if list.count(v) > 1 else v for i, v in enumerate(list)]
return new_list
renamed_list=rename_duplicate(c,True)
# 将截取并重命名的字符串加上后缀名
New_r_l = [] #新的加完后缀名的列表
for i in renamed_list:
r_l = i+'.txt'
New_r_l.append(r_l)
s=0 # 记录新的列表下标
for i in path_read:
ads = New_path+New_r_l[s]
shutil.copy(i, ads)
print(i+'拷贝成功...')
s += 1
print("执行成功,拷贝的文件已经存放在"+New_path+"里面了")