Как получить все файлы в соответствии с определенным каталогом в MATLAB?

Я должен получить все те файлы под D:\dic и цикл по ним для дальнейшей обработки индивидуально.

MATLAB поддерживает этот вид операций?

Это может быть сделано в других сценариях как PHP, Python...

96
задан gnovice 10 May 2017 в 13:55
поделиться

4 ответа

Обновление: Учитывая, что этот пост довольно старый, и за это время я много изменил эту утилиту для собственного использования, я подумал, что должен опубликовать новую версию. Мой последний код можно найти на The MathWorks File Exchange : dirPlus.m . Вы также можете получить исходный код на GitHub .

Я внес ряд улучшений. Теперь он дает вам возможность добавить полный путь или вернуть только имя файла (включено из Doresoom и Oz Radiano ) и применить шаблон регулярного выражения к именам файлов (включенный из Питер Д. ). Кроме того, я добавил возможность применять функцию проверки к каждому файлу, что позволяет вам выбирать их на основе критериев, отличных от их имен (например, размер файла, содержимое, дата создания и т. Д.).


ПРИМЕЧАНИЕ: В более новых версиях MATLAB (R2016b и позже) функция dir имеет возможности рекурсивного поиска! Таким образом, вы можете сделать это, чтобы получить список всех файлов *. M во всех подпапках текущей папки:

dirData = dir('**/*.m');

Старый код: (для потомков)

Вот функция, рекурсивно просматривающая все подкаталоги данного каталога, собирая список всех имен файлов, которые он находит:

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

После сохранения вышеуказанной функции где-нибудь на вашем пути MATLAB, вы можете вызвать ее следующим образом:

fileList = getAllFiles('D:\dic');
126
ответ дан 24 November 2019 в 05:38
поделиться

Я не знаю однофункционального метода для этого, но вы можете использовать genpath , чтобы повторно просмотреть список только подкаталоги . Этот список возвращается в виде строки каталогов, разделенных точкой с запятой, поэтому вам придется разделить его с помощью strread, т.е.

dirlist = strread (genpath ('/ path / of / directory'), '% s', ' delimiter ','; ')

Если вы не хотите включать данный каталог, удалите первую запись dirlist , то есть dirlist (1) = []; так как это всегда первая запись.

Затем получите список файлов в каждом каталоге с зацикленным каталогом .

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.

Это дает вам список имен файлов с полными путями в массиве ячеек список файлов . Я знаю, что это не самое удачное решение.

3
ответ дан 24 November 2019 в 05:38
поделиться

Вы можете использовать регулярное выражение или 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 и продолжать поиск в каждой подпапке, пока ваши dirnames не вернут пустую ячейку для каждого подкаталога.

8
ответ дан 24 November 2019 в 05:38
поделиться

Вы ищете каталог для возврата содержимого каталога.

Чтобы просмотреть результаты, вы можете просто сделать следующее:

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: []
25
ответ дан 24 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: