Matlab пропускает подпапки

У меня есть папка, содержащая последовательные подпапки 000001_wd, 000002_wd,..., в которой я читаю данные, содержащиеся в файле с именем «plane.txt». В некоторых подпапках нет этого файла. Я хочу пропустить их в цикле for-if else, но он не может открыть файл.

Пытался изменить или добавить пути, но ничего не работает

workdir = 'D:\wass\test\output_925\';
cd(workdir)
data_frames = [1:1:37];

nframes = numel(data_frames);
V = zeros(nframes,3);
times = zeros(nframes,1);
ii=1;
prev = cd(workdir);
for frame = data_frames
    fprintf('Processing frame %d\n',frame);
    wdir = sprintf( '%s%06d_wd/', workdir, frame);
    cd(wdir)
     if exist('plane.txt')            
        plane_data = importdata([wdir,'plane.txt']);
        times(ii) = double(ii-1)/fps;
     else
        times(ii) = double(ii-1)/fps;
     end
    ii=ii+1;

end
cd(prev);

fprintf('Saving data...\n');

Я хочу просто продолжить цикл до последней подпапки. Есть ли что-то, что я упускаю, потому что файл, который я пропускаю, находится в подпапке моей последовательности?


person hclarke    schedule 09.09.2019    source источник


Ответы (1)


Оператор exist('plane.txt') проверяет, существует ли файл «plane.txt» в текущем каталоге. Если это так, вы читаете файл в подкаталоге wdir. Очевидно, вы не проверяли, существует ли этот файл.

Я бы упростил ваш код, прочитав данные в блоке try/catch:

workdir = 'D:\wass\test\output_925\';
data_frames = 1:37; % <- don't use square brackets here, they're useless
nframes = numel(data_frames);
times = zeros(nframes,1);
for ii=1:nframes
    frame = data_frames(ii);
    fprintf('Processing frame %d\n',frame);
    wdir = sprintf( '%s%06d_wd/', workdir, frame);
    try
        plane_data = importdata([wdir,'plane.txt']);
        % do something with plane_data here...
    catch
        % ignore error
    end
    times(ii) = double(ii-1)/fps;
end
% ...

Обратите внимание, что я никогда не использовал cd. Вам не нужно менять каталоги для чтения данных, и всегда лучше этого не делать. Оператор importdata использует абсолютный путь, поэтому текущий каталог не имеет значения.


Другой подход предполагает получение списка всех файлов, соответствующих 'D:\wass\test\output_925\*\plane.txt':

files = dir(fullfile(workdir, '*', 'plane.txt'));
for ii=1:numel(files)
   file = fullfile(files(ii).folder, files(ii).name);
   plane_data = importdata(file);
   % do something with plane_data here...
end
person Cris Luengo    schedule 09.09.2019
comment
Спасибо большое! Завтра попробую, пора спать. Я только что попробовал if ~contains('plane.txt', 'plane.txt') вместо if exists('plane.txt'). Кажется, это сработало, но нужно проверить результаты. - person hclarke; 09.09.2019
comment
@hclarke: это всегда будет возвращать false. Вы там сравниваете строки, а не смотрите на файловую систему. - person Cris Luengo; 09.09.2019
comment
Хорошо, как я уже сказал, я должен расписаться. Спасибо! - person hclarke; 09.09.2019