天天看点

(MATLAB)读取主文件夹内所有子文件及包含特定字符的所有文件(含代码)代码测试其他

(MATLAB)读取主文件夹内所有子文件及包含特定字符的所有文件(含代码)

  • 代码
  • 测试
  • 其他

by HPC_ZY

MATLAB读取主文件夹内所有子文件及包含特定字符的所有文件。Python的os.walk()函数就能完成这个任务,但MATLAB自带的dir()只能搜索当前文件夹内的文件夹及文件,所以自己写了这么一个函数(利用递归的思想)。在这里分享给大家。

代码

% 获取主路径下所有的文件、子路径、子路径下文件
%
% 输入:
% folder 文件夹
% str 特定字符
%
% 输出:
% folder 子文件夹列表(文件夹)
% file 文件列表(文件-所在文件夹)
% list 关系总表(文件夹-子文件夹-文件)
%
% example:
% [folder,file,list] = findfolderfile('.\test\img','jpg');
%
% by HPC_ZY 20200105

%% 获取某文件夹下所有子文件列表,与含特定字符的所有文件列表
function [folder,file,list] = findfolderfile(folder,str)

% 利用递归获得子文件夹与文件
list = folderfile(folder,str,[]);

% 文件夹总表
folder = list(:,1);

% 文件总表
file = [];
for k = 1:size(list,1)
    if ~isempty(list(k,3))  
        for n = 1:length(list{k,3})
            file = cat(1,file,{list{k,1},list{k,3}{n}});
        end
    end    
end

end

%% ------------------递归搜索当前文件夹内子文件夹与文件-------------
function list = folderfile(folder,str,list)

    % 获取当前文件夹内的子文件夹和文件
    dirout = dir(fullfile(folder));
    [folder,subfolder,file] = listfolderfile(dirout,str);
    
    % 保存搜索结果
    list = cat(1,list,{folder,subfolder,file});

    % 搜索子文件夹
    if ~isempty(subfolder)
        for k = 1:length(subfolder)
            list = folderfile(fullfile(folder,subfolder{k}),str,list);  
        end
    end

end

%%------------- 分辨文件夹和文件,并去除./..文件-----------
function [folder,subfolder,file] = listfolderfile(list,str)

% 当前目录
folder = list(1).folder;
% 子目录
idx = cell2mat({list.isdir});
subfolder = {list(idx).name}';
% 文件
file = {list(~idx).name}';

% 剔除 ./..
for k = length(subfolder):-1:1
    if sum(strcmp(subfolder{k},{'.','..'}))
        subfolder(k) = [];
    end
end 

% 筛选指定
if ~isempty(str)
	for k = length(file):-1:1
    	if isempty(strfind(file{k},str))
       		file(k) = []; 
    	end
	end
end

end
           

测试

%% 获取路径下所有子文件和文件列表
[folder,file,list] = findfolderfile('.\test\img',[]);

%% 获取路径下所有txt格式的文件列表
[~,file,~] = findfolderfile('.\test\img','.txt');
           

注:我这里讲的获取所有文件,仅仅指获取它们的文件名列表,如果需要读取并进行处理还需另写代码

比如,读取路径下所有jpg格式的图像

[~,file,~] = findfolderfile('.\test\img','.jpg');
fileNum = length(file);
im = cell(fileNum,1);
for n = 1:fileNum
	disp(file{n,2}) % 看看图像文件名
	im{n} = imread(fullfile(file{n,1},file{n,2})); % 读取图像, 文件路径+文件名
end
           

注:为了更方便使用,没有使用“文件路径+文件名”,而是把它们拆开存放的,就如上代码一样

其他

1、做了有限的测试没有出现报错,如果小伙伴们测试有问题,欢迎指出

2、正如标题所写,该代码功能可以搜索“包含指定字符”文件而非“指定类型”,测试示例中只是恰好可以这样用。如,你有一个图片的文件名为“ test.avi.txt.jpg ”,那么你搜索“.avi”或“.txt”类型文件的时候都会误搜到它(当然这种情况出现的概率很低)。

3、有更多更好的点子欢迎留言,如果简单实用,可以无偿实现。

继续阅读