问题提出:
无论是在为了跑深度学习模型而准备数据集,还是其他的一些用途,相信大家都会遇到一个问题:我所需要的图片分布在很多不同的文件夹下,但我不需要这么多文件夹,那么我如果要使用这些图片的话,就需要把这些文件夹下的图片一个个提取出来,然后再放到新建的文件夹下,有时如果文件夹下的图片是按照顺序命名的,比如001.jpg......089.jpg等等,那么将他们放到一个文件夹下还面临文件名重复需要重命名的问题。(比如我需要将deepfashion2数据集的图片提取一部分放到我的文件夹下,就面临以上问题)
那如何将这些图片批量提取并重新放到新的文件夹下呢?
解决方法:
1.首先,需要先新建一个文件夹,存放我们的n个小文件夹:
比如我新建一个zhao-sweater,里面是我需要提取照片的子文件夹
扫描二维码关注公众号,回复:
14680292 查看本文章
2.之后我再创建一个Top文件夹,用来存放我提取之后的照片,
3.运行代码:
import os
import re
import shutil,random
def get_allfile(path): # 获取所有文件
all_file = []
for f in os.listdir(path): # listdir返回文件中所有目录
f_name = os.path.join(path, f)
all_file.append(f_name)
return all_file
def moveFile(fileDir, tarDir):
pathDir = os.listdir(fileDir) # 取图片的原始路径
for name in pathDir:
s=fileDir.split('D://桌面//zhao-sweater\\')[1]#要提取图片的主文件夹
shutil.move(fileDir +"//"+name, tarDir+"//"+s+"_"+name)
def read_directory(train_save_path,val_path,fw,fw1):
train_fileslist = os.listdir(train_save_path)
val_fileslist=os.listdir(val_path)
train_sort_num_list = []
val_sort_num_list = []
for file in train_fileslist:
if file.__contains__("jpg"):
train_sort_num_list.append(int(file.split('Datacluster Fire and Smoke Sample (')[1].split(').jpg')[0])) # 去掉前面的字符串和下划线以及后缀,只留下数字并转换为整数方便后面排序
train_sort_num_list.sort() # 然后再重新排序
for file in val_fileslist:
if file.__contains__("jpg"):
val_sort_num_list.append(int(file.split('Datacluster Fire and Smoke Sample (')[1].split(').jpg')[0])) # 去掉前面的字符串和下划线以及后缀,只留下数字并转换为整数方便后面排序
val_sort_num_list.sort() # 然后再重新排序
i=0
j=0
for filename in os.listdir(train_save_path):
if filename.__contains__("jpg"):
fw.write(train_save_path+"//"+"Datacluster Fire and Smoke Sample ("+str(train_sort_num_list[i])+")"+'\n')
i=i+1;
for filename in os.listdir(val_path):
if filename.__contains__("jpg"):
fw1.write(val_path + "//"+"Datacluster Fire and Smoke Sample ("+str(val_sort_num_list[j])+")" + '\n')
j=j+1
if __name__ == '__main__':
train_path = "D://桌面//zhao-sweater"
all_file = get_allfile(train_path) # tickets要获取文件夹名
onetarDir="D://桌面//Top"#提取之后的文件存放位置
if not os.path.exists(onetarDir):
os.makedirs(onetarDir)
for i in all_file:
moveFile(i,onetarDir)
我们只需要更改三处位置:
s=fileDir.split('D://桌面//zhao-sweater\\')[1]#要提取图片的主文件夹
train_path = "D://桌面//zhao-sweater"#还是主文件夹的路径
onetarDir="D://桌面//Top"#提取之后的文件存放位置
4.提取成功!