MATLAB遍历子文件夹及其下文件
(一)
以前从未遇到过用MATLAB批处理文件的情况,此次项目需要批量将二进制数据文件导入matlab进行svm分类,现将matlab遍历子文件夹及其文件的方法记录下来。
文件目录结构
/maindir
|-- subdir1
|-- datafile1.png
|-- datafile2.png
|-- subdir2
|-- datafiel3.png
|-- datafiel4.png
|-- subdir3
|-- datafile5.png
|-- datafile6.png
主文件夹maindir下含有三个子文件夹,子文件夹分别包含两个二图片
maindir = 'D:\MATLAB\project';
right_image_dir = 'D:\MATLAB\project2';
subdir = dir( maindir );
for i = 1 : length( subdir )
if( isequal( subdir( i ).name, '.' )||...
isequal( subdir( i ).name, '..')||...
~subdir( i ).isdir) % 如果不是目录则跳过
continue;
end
subdirpath = fullfile( maindir, subdir( i ).name, '*.jpg' );
dat = dir( subdirpath ) % 子文件夹下找后缀为jpg的文件
for j = 1 : length( dat )
datpath = fullfile( maindir, subdir( i ).name, dat( j ).name);
im=imread(datpath);
% 此处添加你的对文件读写操作 %
k= k+1;
image_name3=strcat(right_image_dir,num2str(k),'.jpg');
imwrite(im,image_name3,'jpg'); %写图片
end
end
函数dir
可以使用函数dir,D = DIR(‘directory_name’)返回一个结构数组,包含了文件夹directory_name下的子文件夹和子文件的一些信息,第1个成员是文件名,第4个成员表示是否为文件夹。
要注意的是第1个数组元素和第2个数组元素分别是’.’和’…’,表示当前目录和上层目录。
函数uigetdir
由于前面maindir需要指定路径,可能不是太方便。
使用uigetdir可以方便的通过对话框选择文件夹,返回值为文件夹路径名。代码如下:
maindir = uigetdir( ‘选择一个文件夹’ );这里写代码片
上面的例子比较简单,只涉及到两层目录以及指定格式的文件。
(二)
对于多层目录,以及多种格式文件的处理,则可以采用层次遍历与深度遍历两种方法实现。
深度遍历。
p=genpath('Z:\jxq\ATM+RTM+DTM\');%获取指定文件夹下所有子文件的路径
%这些路径存在于字符串p中,以';'分割
% 镜像图像保存
des_path='C:\Users\123\Desktop\DTMATM\';
length_p=size(p,2);%字符串p的长度
path={};%建立一个元胞数组,数组的每个单元中包含一个目录
temp=[];
for i=1:length_p %寻找分隔符';',一旦找到,则将路径temp写入path数组中
if p(i)~=';'
temp=[temp p(i)];
else
temp=[temp '\'];%在路径的后面加上\
path=[path;temp];
temp=[];
end
end
clear p length_p temp
%至此,获得了指定文件夹及其所有子文件夹,接下来就是逐一文件夹读取图像,利用上面的path数组,将路径取出来
file_num=size(path,1);%获取子文件夹的个数
for i=1:file_num
file_path=path{i}; %获取每个文件夹路径
img_path_list=dir(strcat(file_path,'*.jpg')); %获取每个文件夹下的图像列表
img_num=length(img_path_list);%获取文件夹下图像的数量
if img_num > 0
for j=1:img_num %img_num
image_name=img_path_list(j).name;%获取图像名
% 注意,这里的图像读取并不是按照图像的编号顺序读取
image=imread(strcat(file_path,image_name));%读取文件夹下的每一帧图像
fprintf('%d %d %s\n',i,j,strcat(file_path,image_name));%显示正在读取的图像
savedname=strcat(des_path,image_name);
imwrite(image,savedname,'jpg');
end
end
end
其他遍历方式可以查看[Matlab对文件夹的层次遍历和深度遍历],我这里就不进行阐述了。(https://blog.csdn.net/guoxiaojie_415/article/details/21317323)
(三)
新需求,原来文件名格式为a_b_num,需要将文件名改为a_b_(num+100),将最后的数字增加100.
Original_image_dir = 'I:\jxq\jxq\daset\guesture\1\atm\atmleft\left_1\';%需要重命名的文件
right_image_dir = 'I:\jxq\jxq\daset\guesture\1\atm\atmleft\'; %保存新文件的路径
path = gain_file_dir(Original_image_dir);
count = 0;
file_num=size(path,1);%获取子文件夹的个数
for i=1:file_num
file_path=path{i}; %获取每个文件夹路径
img_path_list=dir(strcat(file_path,'*.jpg')); %获取每个文件夹下的图像列表
img_num=length(img_path_list);%获取文件夹下图像的数量
if img_num > 0
for j=1:img_num %img_num
image_name=img_path_list(j).name;%获取图像名
% 注意,这里的图像读取并不是按照图像的编号顺序读取
img_dir = strcat(file_path,image_name);
image=imread(strcat(file_path,image_name));%读取文件夹下的每一帧图像
num = 9;%atm_left_ 分割出前面一部分 ,第几位
qian = image_name(1:num) % 前半部分,atm_left_
new_num = str2num(image_name(num+1:length(image_name)-4)) + 100;%取得前半部分之后到后缀之前部分的数字加100
new_image_name = strcat(qian,sprintf('%05d',new_num),'.jpg')%将三部分拼接,得到新的文件名
imwrite(ir,strcat(right_image_dir,new_image_name),'jpg');
count = count + 1
end
end
end