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、有更多更好的点子欢迎留言,如果简单实用,可以无偿实现。