it-swarm.com.de

Wie bekomme ich alle Dateien in einem bestimmten Verzeichnis in MATLAB?

Ich muss all diese Dateien unter D:\dic finden und sie einzeln ablaufen lassen.

Unterstützt MATLAB diese Art von Operationen?

Es kann in anderen Skripten wie PHP, Python ...

91
Gtker

Update: Da dieser Beitrag ziemlich alt ist und ich dieses Hilfsprogramm in dieser Zeit für meinen eigenen Gebrauch modifiziert habe, dachte ich, ich sollte eine neue Version veröffentlichen. Mein neuester Code kann unter The MathWorks File Exchange : dirPlus.m gefunden werden. Sie können die Quelle auch von GitHub erhalten.

Ich habe einige Verbesserungen vorgenommen. Jetzt haben Sie die Möglichkeit, den vollständigen Pfad voranzustellen oder nur den Dateinamen zurückzugeben (integriert aus Doresoom und Oz Radiano ) und den Dateinamen ein reguläres Ausdrucksmuster zuzuweisen (eingebaut aus Peter D ). Außerdem habe ich die Möglichkeit hinzugefügt, eine Validierungsfunktion auf jede Datei anzuwenden, sodass Sie sie anhand von anderen Kriterien als nur nach ihrem Namen (d. H. Dateigröße, Inhalt, Erstellungsdatum usw.) auswählen können.


HINWEIS: In neueren Versionen von MATLAB (R2016b und höher) verfügt die Funktion dir über rekursive Suchfunktionen! So können Sie eine Liste aller *.m-Dateien in allen Unterordnern des aktuellen Ordners erhalten:

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

Alter Code: (für die Nachwelt)

Hier ist eine Funktion, die rekursiv alle Unterverzeichnisse eines bestimmten Verzeichnisses durchsucht und eine Liste aller gefundenen Dateinamen sammelt:

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

Nachdem Sie die obige Funktion irgendwo in Ihrem MATLAB-Pfad gespeichert haben, können Sie sie folgendermaßen aufrufen:

fileList = getAllFiles('D:\dic');
126
gnovice

Sie suchen nach dir , um den Inhalt des Verzeichnisses zurückzugeben.

Um die Ergebnisse zu wiederholen, können Sie einfach Folgendes tun:

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

Dadurch sollten Sie die Ausgabe im folgenden Format erhalten, z. B .:

name: 'my_file'
date: '01-Jan-2010 12:00:00'
bytes: 56
isdir: 0
datenum: []
25
James B

Ich habe den in this great answer erwähnten Code verwendet und ihn erweitert, um 2 zusätzliche Parameter zu unterstützen, die ich in meinem Fall brauchte. Die Parameter sind Dateierweiterungen zum Filtern und ein Flag, das angibt, ob der vollständige Pfad mit dem Dateinamen verkettet werden soll oder nicht.

Ich hoffe es ist klar genug und jemand wird es für nützlich halten.

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

Beispiel zum Ausführen des Codes:

fileList = getAllFiles(dirName, '*.xml', 0); %#0 is false obviously
13
Oz Radiano

Sie können regexp oder strcmp verwenden, um . und .. .__ zu entfernen. Sie können auch das Feld isdir verwenden, wenn Sie nur Dateien im Verzeichnis und keine Ordner möchten.

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

oder kombiniere die letzten beiden Zeilen:

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

Für eine Liste der Ordner im Verzeichnis mit Ausnahme. und ..

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

Ab diesem Zeitpunkt sollten Sie in der Lage sein, den Code in einer verschachtelten for-Schleife zu werfen und die Suche nach jedem Unterordner fortzusetzen, bis Ihre Verzeichnisse eine leere Zelle für jedes Unterverzeichnis zurückgeben.

8
Doresoom

Diese Antwort beantwortet die Frage nicht direkt, kann aber außerhalb des Kastens eine gute Lösung sein.

Ich habe die Lösung von gnovice aktualisiert, möchte aber eine andere Lösung anbieten: Verwenden Sie den systemabhängigen Befehl Ihres Betriebssystems:

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.

Positiv:

  • Sehr schnell (in meinem Fall für eine Datenbank mit 18000 Dateien unter Linux).
  • Sie können bewährte Lösungen verwenden.
  • Sie müssen keine neue Syntax erlernen oder neu erfinden, um *.wav-Dateien auszuwählen.

Negativ:

  • Sie sind nicht systemunabhängig.
  • Sie verlassen sich auf eine einzelne Zeichenfolge, die möglicherweise schwer zu analysieren ist.
7
Lukas

Ich kenne keine Einzelfunktionsmethode dafür, aber Sie können genpath verwenden, um eine Liste von nur Unterverzeichnisse zu rekursivieren. Diese Liste wird als durch Semikolon getrennte Zeichenfolge von Verzeichnissen zurückgegeben, sodass Sie sie mit strread trennen müssen, d. H.

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

Wenn Sie das angegebene Verzeichnis nicht einschließen möchten, entfernen Sie den ersten Eintrag von dirlist, d. H. dirlist(1)=[];, da dies immer der erste Eintrag ist.

Holen Sie sich dann die Liste der Dateien in jedem Verzeichnis mit einer Schleife 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 gibt das Verzeichnis-Trennzeichen für die Plattform zurück, auf der MATLAB ausgeführt wird.

Dies gibt Ihnen eine Liste von Dateinamen mit vollständigen Pfaden im Zellenarray Dateiliste. Ich weiß, dass dies nicht die sauberste Lösung ist.

3
JS Ng

Dies ist eine praktische Funktion zum Abrufen von Dateinamen mit dem angegebenen Format (normalerweise .mat) in einem Stammverzeichnis.

    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

In Ihrem Fall können Sie den folgenden Ausschnitt verwenden :)

filenames = getFilenames('D:/dic/**');
for i = 1:numel(filenames)
    filename = filenames{i};
    % do your job!
end
1
Yas

Mit wenig Modifikation aber fast gleichem Ansatz erhalten Sie den vollständigen Dateipfad jedes Unterordners

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
Spandan