How to create a loop that runs a function through subfolders in a directory?
99 次查看(过去 30 天)
显示 更早的评论
Hello,
I currently have a folder with 11 subfolders in it. The subfolders have some text files, and I need to run a function through all the subfolders to extract the data from the text files. At the moment I am extracting the data one by one through each folder, because I can't figure out how to successfully do this with a loop. Any suggestions?
0 个评论
采纳的回答
Brendan Hamm
2016-7-6
编辑:Stephen23
2018-9-9
You can get the sub-directories using dir:
D = dir; % A is a struct ... first elements are '.' and '..' used for navigation.
for k = 3:length(D) % avoid using the first ones
currD = D(k).name; % Get the current subdirectory name
% Run your function. Note, I am not sure on how your function is written,
% but you may need some of the following
cd(currD) % change the directory (then cd('..') to get back)
fList = dir(currD); % Get the file list in the subdirectory
end
or you could use the struct as your looping variable:
for k = D
currD = k.name;
cd(currD)
end
6 个评论
Rosie
2020-10-31
@Guillaume can you clarify what you mean when you say "Also, I would avoid cd'ing into the directory. Just pass the path to the subfunction and use full paths for any I/O."? I'm not sure how to write that code within the loop structure. Thank you!
Image Analyst
2020-10-31
更多回答(2 个)
Thorsten
2016-7-6
You can run my function getfn to get all txt files in the current directory and all subdirectories. You can then work on the returned filenames.
fn = getfn(mkdir, 'txt$')
with getfn defined as
function filenames = getfn(mydir, pattern)
%GETFN Get filenames in directory and subdirectories.
%
% FILENAMES = GETFN(MYDIR, PATTERN)
%
% Example: Get all files that end with 'txt' in the current directory and
% all subdirectories
%
% fn = getfn(pwd, 'txt$')
%
% Thorsten.Hansen@psychol.uni-giessen.de 2016-07-06
if nargin == 0
mydir = pwd;
end
% computes common variable FILENAMES: get all files in MYDIR and
% recursively traverses subdirectories to get all files in these
% subdirectories:
getfnrec(mydir)
% if PATTERN is given, select only those files that match the PATTERN:
if nargin > 1
idx = ~cellfun(@isempty, regexp(filenames, pattern));
filenames = filenames(idx);
end
function getfnrec(mydir)
% nested function, works on common variable FILENAMES
% recursively traverses subdirectories and returns filenames
% with path relative to the top level directory
d = dir(mydir);
filenames = {d(~[d.isdir]).name};
filenames = strcat(mydir, filesep, filenames);
dirnames = {d([d.isdir]).name};
dirnames = setdiff(dirnames, {'.', '..'});
for i = 1:numel(dirnames)
fulldirname = [mydir filesep dirnames{i}];
filenames = [filenames, getfn(fulldirname)];
end
end % nested function
end
0 个评论
Image Analyst
2016-7-6
The easiest way to get subfolders is to use the built in function genpath(). No need to even worry about dot or dot dot. genpath() gives a cell array which is a list of all folders. Then use those folders with fullfile() and dir() to get the files in those folders, for example .dat or .xlsx files or whatever. See my attached demo for a demo.
3 个评论
Guillaume
2016-7-6
"The easiest way to get subfolders is to use the built in function genpath"
With one big caveat: folders starting with + or @ or folders named private and any of their subfolders will not be returned.
genpath is not really designed for listing arbitrary path. It's only supposed to work for listing matlab toolbox folders.
It's probably ok for most use case, but of course, in three years the script is going to be used to generate that crucial report that would have won you the nobel prize if only it hadn't skipped over that folder named private.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Search Path 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!