ฉันต้องการรับไฟล์เหล่านั้นทั้งหมดไว้ข้างใต้D:\dic
และวนซ้ำเพื่อประมวลผลทีละไฟล์
MATLAB รองรับการทำงานประเภทนี้หรือไม่?
สามารถทำได้ในสคริปต์อื่น ๆ เช่น PHP, Python ...
ฉันต้องการรับไฟล์เหล่านั้นทั้งหมดไว้ข้างใต้D:\dic
และวนซ้ำเพื่อประมวลผลทีละไฟล์
MATLAB รองรับการทำงานประเภทนี้หรือไม่?
สามารถทำได้ในสคริปต์อื่น ๆ เช่น PHP, Python ...
คำตอบ:
อัปเดต:เนื่องจากโพสต์นี้ค่อนข้างเก่าและฉันได้แก้ไขยูทิลิตี้นี้เป็นจำนวนมากสำหรับการใช้งานของฉันเองในช่วงเวลานั้นฉันคิดว่าฉันควรโพสต์เวอร์ชันใหม่ รหัสใหม่ล่าสุดของฉันสามารถพบได้บนMathWorks ไฟล์แลกเปลี่ยนdirPlus.m
: นอกจากนี้คุณยังจะได้รับแหล่งที่มาจากGitHub
ฉันได้ทำการปรับปรุงหลายอย่าง ตอนนี้มีตัวเลือกให้คุณนำหน้าเส้นทางแบบเต็มหรือส่งคืนเฉพาะชื่อไฟล์ (รวมจากDoresoomและOz Radiano ) และใช้รูปแบบนิพจน์ทั่วไปกับชื่อไฟล์ (รวมจากPeter D ) นอกจากนี้ฉันได้เพิ่มความสามารถในการใช้ฟังก์ชันการตรวจสอบความถูกต้องกับแต่ละไฟล์ทำให้คุณสามารถเลือกได้ตามเกณฑ์อื่น ๆ ที่ไม่ใช่แค่ชื่อ (เช่นขนาดไฟล์เนื้อหาวันที่สร้าง ฯลฯ )
หมายเหตุ:ใน 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');
fileList = strcat(dirName,filesep,fileList);
แทนที่จะใช้ CELLFUN แม้ว่าคุณจะสามารถใช้ตัวคั่นไฟล์พิเศษที่ไม่จำเป็นได้ด้วยวิธีนี้ซึ่ง FULLFILE ก็ดูแลคุณเช่นกัน
if ~isempty(fileList) fileList = cellfun(@(x) fullfile(dirName,x),... %# Prepend path to files fileList,'UniformOutput',false); matchstart = regexp(fileList, pattern); fileList = fileList(~cellfun(@isempty, matchstart)); end
และเปลี่ยนลายเซ็นฟังก์ชันเป็นgetAllFiles(dirName, pattern)
(เช่นในบรรทัดที่ 2 ถึงบรรทัดสุดท้าย)
คุณกำลังมองหาdirเพื่อส่งคืนเนื้อหาไดเร็กทอรี
หากต้องการวนซ้ำผลลัพธ์คุณสามารถทำสิ่งต่อไปนี้:
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: []
.
และ..
?
dir('*.ext')
ซึ่งจะไม่รวมไดเรกทอรีโดยอัตโนมัติ (เว้นแต่ว่าจะลงท้ายด้วย. ถัดไป)
ฉันใช้รหัสที่กล่าวถึงในคำตอบที่ยอดเยี่ยมนี้และขยายเพื่อรองรับพารามิเตอร์เพิ่มเติม 2 ตัวที่ฉันต้องการในกรณีของฉัน พารามิเตอร์คือนามสกุลไฟล์ที่ใช้กรองและแฟล็กที่ระบุว่าจะต่อพา ธ แบบเต็มเข้ากับชื่อไฟล์หรือไม่
ฉันหวังว่ามันจะชัดเจนพอและใครบางคนจะพบว่ามันเป็นประโยชน์
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)));
จากจุดนี้คุณควรจะสามารถโยนรหัสในการวนซ้ำที่ซ้อนกันและค้นหาแต่ละโฟลเดอร์ย่อยต่อไปจนกว่าชื่อของคุณจะส่งคืนเซลล์ว่างสำหรับแต่ละไดเร็กทอรีย่อย
คำตอบนี้ไม่ได้ตอบคำถามโดยตรง แต่อาจเป็นทางออกที่ดีนอกกรอบ
ฉันยกระดับโซลูชันของ gnovice แต่ต้องการเสนอโซลูชันอื่น: ใช้คำสั่งที่ขึ้นกับระบบของระบบปฏิบัติการของคุณ:
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.
บวก:
*.wav
ไฟล์ieเชิงลบ:
ผมไม่ทราบว่าเป็นวิธีการเดียวฟังก์ชั่นนี้ แต่คุณสามารถใช้genpath
เพื่อ recurse รายการไดเรกทอรีย่อยเท่านั้น รายการนี้จะส่งคืนเป็นสตริงของไดเร็กทอรีที่คั่นด้วยอัฒภาคดังนั้นคุณจะต้องแยกรายการโดยใช้ 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 ทำงานอยู่
นี้จะช่วยให้คุณรายการของชื่อไฟล์ที่มีเส้นทางเต็มรูปแบบในเซลล์อาร์เรย์filenamelist ไม่ใช่วิธีแก้ปัญหาที่สะอาดที่สุดฉันรู้
genpath
มันจะค้นหาสองครั้งเป็นหลัก
private
จะไม่ถูกรวมไว้
นี่เป็นฟังก์ชันที่มีประโยชน์สำหรับการรับชื่อไฟล์โดยมีรูปแบบที่ระบุ (โดยปกติ.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
ด้วยการปรับเปลี่ยนเพียงเล็กน้อย แต่เกือบจะคล้ายกันเพื่อให้ได้เส้นทางไฟล์แบบเต็มของแต่ละโฟลเดอร์ย่อย
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