【问题标题】:Loop over folders?循环遍历文件夹?
【发布时间】:2013-09-26 09:41:27
【问题描述】:

我有这样的代码:

          myFolder='C:\Users\abe7rt\Desktop\dat\1';
          filePattern=fullfile(myFolder, '*.txt');
          txtFiles=dir(filePattern); 

现在,dat 是一个包含“1,2,3”文件夹的文件夹,每个文件夹都包含 20 个 TXT 文件。 前面的代码能够从 1 个文件夹中获取 txt 文件。现在我的问题是:有没有办法遍历所有目录?

【问题讨论】:

    标签: matlab loops directory


    【解决方案1】:

    还有另一种可能,使用 MATLAB 自带的 apache commons 库:

    function fileNames = findAllFiles(directory, wildcardPattern)
    
        import org.apache.commons.io.filefilter.*;
        import org.apache.commons.io.FileUtils;
        import java.io.File;
    
        files = FileUtils.listFiles( File(directory),...
                                     WildcardFileFilter(wildcardPattern),...
                                     FileFilterUtils.trueFileFilter());
    
        fileNames = cellfun(@(f) char(f.getCanonicalPath()),...
                            cell(files.toArray()),...
                            'uniformOutput', false);
    end
    

    使用例如如:

    files = findAllFiles('C:\Users\abe7rt\Desktop\dat', '*.txt')
    

    如果您还想在搜索应下降的目录名称上应用模式,您只需将FileFilterUtils.trueFileFilter() 替换为另一个WildcardFileFilter

    【讨论】:

    • 是否可以在文件夹上使用它?比如,是否可以遍历文件夹名称而不是文件?因此,结果将是具有指定名称的文件夹(路径)列表?
    【解决方案2】:

    是的,有:)

    一个非常好的功能是这个:

    by gnovice: getAllFiles

    你可以这样使用它:

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

    然后你只需要摆脱非 txt 文件,例如通过检查循环内的扩展!

    【讨论】:

    • 但在这种情况下,我将无法控制所有数据 *too much dat.. 我有 20 个子文件夹?
    • 嗯,这很特别……那你会得到什么错误信息?
    • 不。它确实有效,但我只是在 thess 文件夹中获得了所有 txt,所以我将无法控制这个 txt 文件。
    • “控制”是什么意思?如果文件太多或有您不想包含的文件夹,您可以在之后过滤结果。
    • 好的。每个文件夹包含 3 个文件夹,每个文件夹包含大约 20 个 txt 文件。这些 txt 文件在所有文件夹中从 1 到 20 开始。
    【解决方案3】:

    你可以做类似的事情

    for k=1:3
        myFolder{k}=['C:\Users\abe7rt\Desktop\dat\' num2str(k)];
        filePattern{k}=fullfile(myFolder{k}, '*.txt');
        txtFiles{k}=dir(filePattern{k});
    end
    

    如果性能/内存有问题,您显然可以预先分配数组/元胞数组的大小。

    【讨论】:

    • 我不知道如何预先分配数组的大小?下标分配维度不匹配。
    • 第二个myFolder(k)=['C:\Users\abe7rt\Desktop\dat\'num2str(k)];
    • 我的意思是在这里解释一下单元格数组是什么意思??
    • mathworks.co.uk/help/matlab/cell-arrays.html。我编辑了我的答案以使用 {k} 代替 (k)
    • 如果我想使用 txt 文件来执行一些任务。我可以用这个txtFiles{k}=dir(filePattern{k}.name);
    【解决方案4】:

    你可以使用Matlab的函数fileattrib的递归版本,然后选择带有regexp的txt文件。此解决方案适用于任意数量的文件夹和任意级别的嵌套。

    [success,message,messageid] = fileattrib('C:\Users\abe7rt\Desktop\dat\*');
    [names{1:numel(message)}] = deal(message.Name);
    names_txt = names(~cellfun(@isempty, regexp(names,'\.txt$')));
    

    元胞数组names_txt 包含所有txt 文件的全名。所以names_txt{n}是一个带有第n个文件全名的字符串。

    确保将最终的\* 添加到根路径。

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多