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)