如何获取MATLAB中的特定目录下的所有文件?
我需要将所有这些文件都放在D:\dic
然后遍历它们以进一步单独处理。
MATLAB支持这种操作吗?
它可以在PHP,Python等其他脚本中完成。
更新:鉴于这个post是相当古老的,我已经修改这个实用程序很多我自己在这段时间使用,我想我应该发布一个新的版本。 我可以在The MathWorks文件交换中find最新的代码: dirPlus.m
。 你也可以从GitHub获得源代码。
我做了一些改进。 现在,您可以select预先设置完整path或返回文件名(从Doresoom和Oz Radiano合并 ),并将正则expression式模式应用于文件名(由Peter D合并)。 另外,我添加了对每个文件应用validationfunction的function,允许您根据除了名称(即文件大小,内容,创builddate等)之外的标准来select它们。
注意:在较新版本的MATLAB(R2016b及更高版本)中, dir
函数具有recursionsearchfunction! 所以你可以做到这一点,以获得当前文件夹的所有子文件夹中的所有*.m
文件的列表:
dirData = dir('**/*.m');
旧代码:(后人)
下面是一个recursionsearch给定目录的所有子目录的函数,收集它find的所有文件名的列表:
function fileList = getAllFiles(dirName) dirData = dir(dirName); %# Get the data for the current directory dirIndex = [dirData.isdir]; %# Find the index for directories fileList = {dirData(~dirIndex).name}'; %'# Get a list of the files if ~isempty(fileList) fileList = cellfun(@(x) fullfile(dirName,x),... %# Prepend path to files fileList,'UniformOutput',false); end subDirs = {dirData(dirIndex).name}; %# Get a list of the subdirectories validIndex = ~ismember(subDirs,{'.','..'}); %# Find index of subdirectories %# that are not '.' or '..' for iDir = find(validIndex) %# Loop over valid subdirectories nextDir = fullfile(dirName,subDirs{iDir}); %# Get the subdirectory path fileList = [fileList; getAllFiles(nextDir)]; %# Recursively call getAllFiles end end
在MATLABpath的某处保存上述函数后,可以通过以下方式调用它:
fileList = getAllFiles('D:\dic');
您正在寻找目录来返回目录内容。
要循环播放结果,只需执行以下操作:
dirlist = dir('.'); for i = 1:length(dirlist) dirlist(i) end
这应该给你以下格式的输出,例如:
name: 'my_file' date: '01-Jan-2010 12:00:00' bytes: 56 isdir: 0 datenum: []
我使用了这个很好的答案中提到的代码,并将其扩展为支持我需要的两个额外参数。 参数是要过滤的文件扩展名和一个标志,指示是否将完整path连接到文件的名称。
我希望这是清楚的,有人会发现它是有益的。
function fileList = getAllFiles(dirName, fileExtension, appendFullPath) dirData = dir([dirName '/' fileExtension]); %# Get the data for the current directory dirWithSubFolders = dir(dirName); dirIndex = [dirWithSubFolders.isdir]; %# Find the index for directories fileList = {dirData.name}'; %'# Get a list of the files if ~isempty(fileList) if appendFullPath fileList = cellfun(@(x) fullfile(dirName,x),... %# Prepend path to files fileList,'UniformOutput',false); end end subDirs = {dirWithSubFolders(dirIndex).name}; %# Get a list of the subdirectories validIndex = ~ismember(subDirs,{'.','..'}); %# Find index of subdirectories %# that are not '.' or '..' for iDir = find(validIndex) %# Loop over valid subdirectories nextDir = fullfile(dirName,subDirs{iDir}); %# Get the subdirectory path fileList = [fileList; getAllFiles(nextDir, fileExtension, appendFullPath)]; %# Recursively call getAllFiles end end
运行代码示例:
fileList = getAllFiles(dirName, '*.xml', 0); %#0 is false obviously
你可以使用regexp或strcmp来消除.
和..
或者你可以使用isdir
字段,如果你只想要目录中的文件,而不是文件夹。
list=dir(pwd); %get info of files/folders in current directory isfile=~[list.isdir]; %determine index of files vs folders filenames={list(isfile).name}; %create cell array of file names
或者结合最后两行:
filenames={list(~[list.isdir]).name};
有关不包括在目录中的文件夹列表。 和..
dirnames={list([list.isdir]).name}; dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',dirnames)));
从这一点,你应该能够把代码放在一个嵌套for循环,并继续search每个子文件夹,直到你的dirnames为每个子目录返回一个空的单元格。
这个答案不直接回答这个问题,但可能是一个很好的解决scheme。
我upvoted gnovice的解决scheme,但要提供另一种解决scheme:使用系统依赖于您的操作系统的命令:
tic asdfList = getAllFiles('../TIMIT_FULL/train'); toc % Elapsed time is 19.066170 seconds. tic [status,cmdout] = system('find ../TIMIT_FULL/train/ -iname "*.wav"'); C = strsplit(strtrim(cmdout)); toc % Elapsed time is 0.603163 seconds.
正:
- 非常快(在我的情况下,在Linux上的18000个文件的数据库)。
- 您可以使用testing良好的解决scheme
- 您不需要学习或重新创build新的语法来selectie
*.wav
文件。
负:
- 你不是系统独立的。
- 你依靠一个可能很难parsing的string。
我不知道这个单一函数的方法,但你可以使用genpath
来recursion一个子目录的列表。 这个列表是以分号分隔的目录串返回的,所以你必须用strread来分隔它,即
dirlist = strread(genpath('/path/of/directory'),'%s','delimiter',';')
如果你不想包含给定的目录,删除dirlist
的第一个条目,即dirlist(1)=[];
因为它总是第一个入口。
然后用循环dir
获取每个目录中的文件列表。
filenamelist=[]; for d=1:length(dirlist) % keep only filenames filelist=dir(dirlist{d}); filelist={filelist.name}; % remove '.' and '..' entries filelist([strmatch('.',filelist,'exact');strmatch('..',filelist,'exact'))=[]; % or to ignore all hidden files, use filelist(strmatch('.',filelist))=[]; % prepend directory name to each filename entry, separated by filesep* for f=1:length(filelist) filelist{f}=[dirlist{d} filesep filelist{f}]; end filenamelist=[filenamelist filelist]; end
filesep
返回运行MATLAB的平台的目录分隔符。
这给你一个单元格arrays文件名列表中具有完整path的文件名列表。 不是最好的解决办法,我知道。
这是一个方便的函数获取文件名,指定的格式(通常是.mat
)在一个根文件夹!
function filenames = getFilenames(rootDir, format) % Get filenames with specified `format` in given `foler` % % Parameters % ---------- % - rootDir: char vector % Target folder % - format: char vector = 'mat' % File foramt % default values if ~exist('format', 'var') format = 'mat'; end format = ['*.', format]; filenames = dir(fullfile(rootDir, format)); filenames = arrayfun(... @(x) fullfile(x.folder, x.name), ... filenames, ... 'UniformOutput', false ... ); end
在你的情况下,你可以使用下面的代码片段:)
filenames = getFilenames('D:/dic/**'); for i = 1:numel(filenames) filename = filenames{i}; % do your job! end