【问题标题】:randomly move files from a folder to another folder?随机将文件从一个文件夹移动到另一个文件夹?
【发布时间】:2017-08-07 16:49:46
【问题描述】:

我正在尝试移动我的文件并创建一个新文件夹以将这些文件放在那里。 我的 MATLAB 目录中的 images 文件夹中有许多 .png 文件。我想随机选择其中的 80% 并将它们移动到我的 matlab 目录中另一个名为 training 文件夹的文件夹中。这是我的代码不起作用。它找不到要移动的文件:(

data_add = fullfile(cd,'images');
all_files = dir(data_add);
all_files = all_files(3:end);
num_files = numel(all_files);
image_order = randperm(num_files);
for k = 1:(image_order)*0.8  
     file_name = all_files(k).name;
     file_add = all_files(k).folder;
     file_to_move = fullfile('path_to_images\images',file_name);
     mkdir training
    movefile file_to_move training

end

【问题讨论】:

  • 你不应该在循环内有 mkdir。 file_add 是做什么用的?
  • 是的,我完全忘记了那个 mkdir。我只是写它来提供我想要移动的文件的路径,但后来我决定使用 fullfile() 我也应该评论一下:S

标签: matlab file random move training-data


【解决方案1】:

这里有几个问题:

  1. 与 Flynn cmets 一样,只需调用一次 mkdir training,因此您可以将其放在循环之前。
  2. 当涉及到 for 循环时,您可能会错误地考虑变量 image_order

    调用image_order = randperm(num_files); 会从 1:num_files 生成一个随机排序的索引数组,这很有帮助。但是,表达式(image_order)*0.8 实际上是将这些索引中的每一个乘以 0.8,这样它们就不再是有效的整数索引(除了一些,比如 8 会变成 1)。

    我认为您正在尝试和想要做的是:

    mkdir('training');  
    for k = 1:num_files*0.8
       randK = image_order(k);
       file_name = all_files(randK).name;
       file_to_move = fullfile(data_add,file_name);
    
       movefile(file_to_move, 'training'); % using function style
     end
    

接下来您可能会遇到其他问题,具体取决于培训文件夹所在的位置以及您运行脚本的位置,但这应该更接近您要获得的内容,并且至少可以为您找到文件。

【讨论】:

  • 非常感谢。我尝试了此代码,但出现错误“使用 movefile 未找到匹配文件”。但是 file_to_move 有地址和文件名。所以我不知道如何将这些文件复制到培训文件夹?
  • 也许您使用了我给出的路径名作为示例?我使用您使用的路径的变量名称编辑了帖子(我相信data_add)。
  • 不是我用了数据地址还是说找不到文件!!
  • 抱歉,请尝试使用 movefile 的函数式语法,否则我认为它会将file_to_move 视为不存在的字符串'file_to_move'。我相应地更新了帖子。
  • 是的,再次感谢。但是 movefile 函数第二个元素中只有一件事应该在“”内。但没让我编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多