问题
我在使用matlab对删格文件进行计算时,发现由于命名问题,matlab读取文件顺序并不是按照顺序运行,例如,我的文件命名是“1.tif’,‘2.tif’,……‘11.tif’,‘12,tif’。
那么,matlab批量读取的顺序便是’1.tif’,‘10.tif’,‘11.tif’,‘12.tif’,‘2.tif’……‘9.tif‘。
为了解决这个问题,我需要将长度较小的文件前面加一个’0‘,这样,读取顺序会变为:’01.tif’,‘02.tif’……'12.tif’。
批量修改文件名的操作有很多种,在matlab中,常见的方法有:调动系统命令批量修改与使用matlab函数的copyfile 与movefile。
后者方法代码示例如下:
PDF files in the current folder
files = dir('*.pdf');
% Loop through each
for id = 1:length(files)
% Get the file name (minus the extension)
[~, f] = fileparts(files(id).name);
% Convert to number
num = str2double(f);
if ~isnan(num)
% If numeric, rename
movefile(files(id).name, sprintf('%03d.pdf', num));
end
end
使用后者的好处是:限制少、语法更简单好写,功能更多(可以移动文件或文件夹)
而且movefile是matlab函数,不会受到系统影响,而如果你使用system命令,在程序移植到其他系统中运行时如果系统命令的用法不同也会运行失败
所以不管从兼容性,还是简洁,功能更强各个方面来说,movefile都是更好的选择。
然而,movefile需要重新选择文件夹或者在同一文件夹中,这会造成文件冗余情况,因此,若要直接对文件名进行修改,需要调动系统命令。
坑
在搜索matlab文件重命名时,你很容易搜到这样的命令:
command = [‘rename’ 32 oldname 32 newname];
status = dos(command);
if status == 0
disp([oldname, ’ 已被重命名为 ‘, newname])
else
disp([oldname, ’ 重命名失败!’])
break;
end
这个命令是针对默认路径下matlab文件名批量修改,而在实际使用中,我们需要使用绝对路径。并且,文件路径中若带有空格,则需改为:
command = [‘RENAME’ 32 ,’"’,oldname,’"’,32 newname];
然而,你会发现在实际使用中,命名没有空格,仍会出现语法出错和命名失败的问题,这就我下面要强调的一点:
打开cmd,输入rename:
注意上面的格式,path只有在filename1前才有,也就是说,如果你要输入绝对路径,只要在oldname输入即可,newname是不可以包含路径的!!
下面给出我的代码:
year=2005:2014;
path2='D:\data\AI_proj\result\resample\';
for i=1:length(year)
filepath{i}=strcat(path2,num2str(year(i)),'\');
end
for k=1:length(year)
e=dir([filepath{k},'*.tif']);
for i=1:size(e,1)
oldname=[filepath{k},e(i).name];
if length(e(i).name)==13;
newname=['0',e(i).name];%newname 不能带路径!
status = system(['rename ',oldname,' ', newname]);
end
end
end
以上,亲测可行,希望帮到各位,