Comment obtenir tous les fichiers sous un répertoire spécifique dans MATLAB?

j'ai besoin de récupérer tous ces fichiers sous D:dic et les passer en boucle pour les traiter individuellement.

MATLAB soutient-il ce genre d'opérations?

cela peut être fait dans D'Autres scripts comme PHP,Python...

90
demandé sur gnovice 2010-04-16 15:49:14

8 réponses

mise à Jour: étant Donné que ce post est assez ancien, et j'ai modifié cet utilitaire beaucoup pour mon propre usage pendant ce temps, j'ai pensé que je devrais poster une nouvelle version. Mon code le plus récent se trouve sur The MathWorks File Exchange : dirPlus.m . Vous pouvez également obtenir la source de GitHub .

j'ai fait un certain nombre d'améliorations. Il vous donne maintenant des options pour préparer le plein chemin d'accès ou de retour juste le nom du fichier (constituée de Doresoom et Oz Radiano ) et d'appliquer un modèle d'expression régulière pour les noms de fichier (constituée de Pierre D ). En outre, j'ai ajouté la possibilité d'appliquer une fonction de validation à chaque fichier, vous permettant de les sélectionner en fonction de critères autres que leurs noms (c.-à-d. Taille du fichier, contenu, date de création, etc.).


NOTE: dans les versions plus récentes de MATLAB (R2016b et suivantes), la fonction dir a des capacités de recherche récursives! Vous pouvez donc faire ceci pour obtenir une liste de tous les fichiers *.m dans tous les sous-dossiers du dossier courant:

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

ancien code: (pour la postérité)

Voici une fonction qui recherche récursivement à travers tous les sous-répertoires d'une donnée répertoire, la collecte d'une liste de tous les noms de fichiers qu'il trouve:

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

après avoir sauvegardé la fonction ci-dessus quelque part sur votre chemin MATLAB, vous pouvez l'appeler de la manière suivante:

fileList = getAllFiles('D:\dic');
125
répondu gnovice 2017-05-23 10:31:16

vous recherchez dir pour retourner le contenu du répertoire.

pour passer en boucle sur les résultats, vous pouvez simplement faire ce qui suit:

dirlist = dir('.');
for i = 1:length(dirlist)
    dirlist(i)
end

cela devrait vous donner la sortie dans le format suivant, par exemple:

name: 'my_file'
date: '01-Jan-2010 12:00:00'
bytes: 56
isdir: 0
datenum: []
23
répondu James B 2014-01-10 13:30:30

j'ai utilisé le code mentionné dans cette grande réponse et l'ai étendu pour supporter 2 paramètres supplémentaires dont j'avais besoin dans mon cas. Les paramètres sont des extensions de fichier à filtrer et un indicateur indiquant si concaténer le chemin complet vers le nom du fichier ou non.

j'espère que c'est assez clair et que quelqu'un trouve, il est bénéfique.

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

exemple pour exécuter le code:

fileList = getAllFiles(dirName, '*.xml', 0); %#0 is false obviously
13
répondu Oz Radiano 2017-05-23 12:10:08

vous pouvez utiliser regexp ou strcmp pour éliminer . et .. Ou vous pouvez utiliser le champ isdir si vous voulez seulement des fichiers dans le répertoire, pas des dossiers.

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

ou combiner les deux dernières lignes:

filenames={list(~[list.isdir]).name};

pour une liste de dossiers dans le répertoire excluant . et. .

dirnames={list([list.isdir]).name};
dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',dirnames)));

à partir de ce point, vous devriez être en mesure de jeter le code dans une boucle emboîtée, et continuer la recherche chaque sous-dossier jusqu'à ce que votre nom de domaine renvoie une cellule vide pour chaque sous-dossier.

8
répondu Doresoom 2010-04-16 15:20:33

Cette réponse ne répond pas directement à la question, mais peut-être une bonne solution à l'extérieur de la boîte.

j'ai voté en faveur de la solution de gnovice, mais je veux offrir une autre solution: utilisez la commande système dépendante de votre système d'exploitation:

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.

positif:

  • très rapide (dans mon cas pour une base de données de 18000 fichiers sur linux).
  • Vous pouvez utiliser bien testé solution.
  • vous n'avez pas besoin d'apprendre ou de réinventer une nouvelle syntaxe pour sélectionner les fichiers *.wav .

négatif:

  • Vous n'êtes pas indépendant du système.
  • vous comptez sur une seule corde qui peut être difficile à analyser.
7
répondu Lukas 2014-04-02 08:31:55

Je ne connais pas de méthode à fonction unique pour cela, mais vous pouvez utiliser genpath pour recréer une liste de sous-répertoires seulement . Cette liste est retournée comme une chaîne de répertoires délimitée par un point-virgule, Vous devrez donc la séparer en utilisant strread, i.e.

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

si vous ne voulez pas inclure le répertoire donné, supprimez la première entrée de dirlist , i.e. dirlist(1)=[]; car il s'agit toujours de la première entrée.

Puis obtenir la liste des fichiers dans chaque répertoire avec une boucle 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 renvoie le séparateur de répertoires de la plate-forme sur laquelle MATLAB est en cours d'exécution.

cela vous donne une liste de noms de fichiers avec des chemins complets dans le tableau de cellules filenamelist . Pas la plus élégante solution, je le sais.

3
répondu JS Ng 2010-04-16 15:22:20

c'est une fonction pratique pour obtenir des noms de fichiers, avec le format spécifié (habituellement .mat ) dans un dossier racine!

    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

dans votre cas, vous pouvez utiliser l'extrait suivant:)

filenames = getFilenames('D:/dic/**');
for i = 1:numel(filenames)
    filename = filenames{i};
    % do your job!
end
1
répondu Yas 2017-09-10 11:03:14

avec peu de modification mais approche presque similaire pour obtenir le chemin complet du fichier de chaque sous-dossier

dataFolderPath = 'UCR_TS_Archive_2015/';

dirData = dir(dataFolderPath);      %# 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(dataFolderPath,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(dataFolderPath,subDirs{iDir});    %# Get the subdirectory path
    getAllFiles = dir(nextDir);
    for k = 1:1:size(getAllFiles,1)
        validFileIndex = ~ismember(getAllFiles(k,1).name,{'.','..'});
        if(validFileIndex)
            filePathComplete = fullfile(nextDir,getAllFiles(k,1).name);
            fprintf('The Complete File Path: %s\n', filePathComplete);
        end
    end
end  
0
répondu Spandan 2018-01-02 12:02:17