天天看點

(MATLAB)讀取主檔案夾内所有子檔案及包含特定字元的所有檔案(含代碼)代碼測試其他

(MATLAB)讀取主檔案夾内所有子檔案及包含特定字元的所有檔案(含代碼)

  • 代碼
  • 測試
  • 其他

by HPC_ZY

MATLAB讀取主檔案夾内所有子檔案及包含特定字元的所有檔案。Python的os.walk()函數就能完成這個任務,但MATLAB自帶的dir()隻能搜尋目前檔案夾内的檔案夾及檔案,是以自己寫了這麼一個函數(利用遞歸的思想)。在這裡分享給大家。

代碼

% 擷取主路徑下所有的檔案、子路徑、子路徑下檔案
%
% 輸入:
% folder 檔案夾
% str 特定字元
%
% 輸出:
% folder 子檔案夾清單(檔案夾)
% file 檔案清單(檔案-所在檔案夾)
% list 關系總表(檔案夾-子檔案夾-檔案)
%
% example:
% [folder,file,list] = findfolderfile('.\test\img','jpg');
%
% by HPC_ZY 20200105

%% 擷取某檔案夾下所有子檔案清單,與含特定字元的所有檔案清單
function [folder,file,list] = findfolderfile(folder,str)

% 利用遞歸獲得子檔案夾與檔案
list = folderfile(folder,str,[]);

% 檔案夾總表
folder = list(:,1);

% 檔案總表
file = [];
for k = 1:size(list,1)
    if ~isempty(list(k,3))  
        for n = 1:length(list{k,3})
            file = cat(1,file,{list{k,1},list{k,3}{n}});
        end
    end    
end

end

%% ------------------遞歸搜尋目前檔案夾内子檔案夾與檔案-------------
function list = folderfile(folder,str,list)

    % 擷取目前檔案夾内的子檔案夾和檔案
    dirout = dir(fullfile(folder));
    [folder,subfolder,file] = listfolderfile(dirout,str);
    
    % 儲存搜尋結果
    list = cat(1,list,{folder,subfolder,file});

    % 搜尋子檔案夾
    if ~isempty(subfolder)
        for k = 1:length(subfolder)
            list = folderfile(fullfile(folder,subfolder{k}),str,list);  
        end
    end

end

%%------------- 分辨檔案夾和檔案,并去除./..檔案-----------
function [folder,subfolder,file] = listfolderfile(list,str)

% 目前目錄
folder = list(1).folder;
% 子目錄
idx = cell2mat({list.isdir});
subfolder = {list(idx).name}';
% 檔案
file = {list(~idx).name}';

% 剔除 ./..
for k = length(subfolder):-1:1
    if sum(strcmp(subfolder{k},{'.','..'}))
        subfolder(k) = [];
    end
end 

% 篩選指定
if ~isempty(str)
	for k = length(file):-1:1
    	if isempty(strfind(file{k},str))
       		file(k) = []; 
    	end
	end
end

end
           

測試

%% 擷取路徑下所有子檔案和檔案清單
[folder,file,list] = findfolderfile('.\test\img',[]);

%% 擷取路徑下所有txt格式的檔案清單
[~,file,~] = findfolderfile('.\test\img','.txt');
           

注:我這裡講的擷取所有檔案,僅僅指擷取它們的檔案名清單,如果需要讀取并進行處理還需另寫代碼

比如,讀取路徑下所有jpg格式的圖像

[~,file,~] = findfolderfile('.\test\img','.jpg');
fileNum = length(file);
im = cell(fileNum,1);
for n = 1:fileNum
	disp(file{n,2}) % 看看圖像檔案名
	im{n} = imread(fullfile(file{n,1},file{n,2})); % 讀取圖像, 檔案路徑+檔案名
end
           

注:為了更友善使用,沒有使用“檔案路徑+檔案名”,而是把它們拆開存放的,就如上代碼一樣

其他

1、做了有限的測試沒有出現報錯,如果小夥伴們測試有問題,歡迎指出

2、正如标題所寫,該代碼功能可以搜尋“包含指定字元”檔案而非“指定類型”,測試示例中隻是恰好可以這樣用。如,你有一個圖檔的檔案名為“ test.avi.txt.jpg ”,那麼你搜尋“.avi”或“.txt”類型檔案的時候都會誤搜到它(當然這種情況出現的機率很低)。

3、有更多更好的點子歡迎留言,如果簡單實用,可以無償實作。

繼續閱讀