利用MATLAB批量對文件重命名
tags:
- MATLAB
- 科研軟件
序

沒paper,實驗肯定要做啊,不做就畢不了業(yè) 。
編程這方面,編程是不可能編程的,這輩子不可能編程的 。
paper又發(fā)不了 就是寫這種東西 才能維持的了生活這樣子
進實驗室感覺像回家一樣 在實驗室里的感覺比寢室里感覺好多了! 里面?zhèn)€個都是人才,說話又好聽,我超喜歡里面的!
——竊·格瓦拉
前段時間想著天天做實驗太無聊了,可以抽時間把平時自己一些科研的小tips分享出來,這樣至少可以做到有些輸出,而不是每天都是做無聊的實驗,幾年如一日,毫無社交毫無長進。
這個系列打算一直做下去,這部分就是關于MATLAB的。MATLAB這么強大的工具除了可以用來做科學計算,仿真模擬以外還可以助力我們平時的科研辦公。所以,平時用的到MATLAB的小伙伴們可以一起交流學習一下。
以下正文:
背景:
有時候文件夾中有一堆相同類型的文件,剛開始拷貝進去的時候排列的順序就是按照我們最開始放進去的時間來排列的(即按照最新修改順序),但是后面我們可能對立面的某些文件作出一些修改,那這樣順序就變了,但是我又只想要最開始的排列順序。
因為文件名完全無規(guī)則,我們無法通過文件名的索引順序排列。這個時候就得在最開始的時候就對文件進行重命名,讓文件名本身帶上數(shù)字或者字母等方便排序的內(nèi)容。但是一個文件就操作的一次的話是很累的一件事。
需要修改名稱的文件
方案:
所以今天給大家介紹下我的做法,用MATLAB實現(xiàn)批量修改文件名稱,包括兩種方法:
一種是自由度比較小的,只能在文件本身名字的基礎上加上前綴或者后綴,可以是數(shù)字或字母
另一種是自由度比較大的,不過在中間修改文件名字的時候要借助Excel。
可以看自己的需求選用吧,文末會附上實現(xiàn)的完整代碼。下面分別介紹兩種方法。
方案一:
- 先獲取指定路徑下的所有特定文件名稱,此處用到dir函數(shù)
path ='D:\my data\實驗數(shù)據(jù)\IV測試\20170222\';
Files= dir(strcat(path,'*.xlsx'));%這是要改的文件名的目錄,我的是xlsx文件
- 利用循環(huán)將每個文件依次重命名,順序是按照在該文件夾下本來的順序。這里為了不破壞原有文件,我們選擇copyfile函數(shù)把文件復制為新文件到其他地址。
for i=1:length(Files)
x1=Files(i).name;%取出第一個文件的名稱
a = sprintf('%03d',i);%類似‘0001’為前綴的命名方式,數(shù)字依次遞增
x2=num2str(a);%轉為字符串
x3=strcat(x2,'-',x1);
copyfile([path x1],['D:\處理好的數(shù)據(jù)\' x3]);%復制到“處理好的數(shù)據(jù)”文件夾中
end
到這里,所有的文件就按照順序重命名為新的格式了,存在“處理好的數(shù)據(jù)”文件夾中。且命名的格式是按照你設定的格式。

方案二:
- 先獲取指定路徑下的所有特定文件名稱,此處還是用到dir函數(shù)
path ='D:\my_data-201508-201710\test-data\IV-test\20170702\';
%需要重命名的文件所在的地址。此處應當注意文件地址中不要出現(xiàn)空格,否則程序會報錯
Files = dir(strcat(path,'*.xlsx'));
- 將獲取到的文件名稱變量寫入到一個指定的Excel文件中,這里因為我們獲取到的Files變量是一個元胞數(shù)組,每個原胞中有name屬性的變量,所以要應用循環(huán)來將每個元胞數(shù)據(jù)中的name變量提取出來。
LengthFiles = length(Files);
for i = 1:LengthFiles
d=Files(i).name;
f(i)=cellstr(d);%轉化為字符串再進行賦值
end
f=f.';%轉置一下
xlswrite('C:\Users\ye\Desktop\matlab_rename_data.xlsx',f,'sheet1','A1');
%先將名字數(shù)據(jù)寫入Excel數(shù)據(jù)中,以便后續(xù)在Excel中修改數(shù)據(jù),再將修改好的數(shù)據(jù)重新讀取
- 在Excel文件中按自己想需求修改文件名稱,這里Excel怎樣操作就不介紹了,畢竟不同人有不同的需求。

- 修改完之后需要做的就是如何把修改完之后的名稱變量按順序重新命名給對應的文件。這里先把修改完的名稱變量從Excel文件中讀取出來。
[data,file_id] = xlsread('C:\Users\ye\Desktop\matlab_rename_data.xlsx', 'sheet1', 'A1:A78');
%重新讀取的修改好的名字變量。
%這里可以指定讀取的具體單元格
%比如采用xlsread('PATH', 'sheet1', 'A1:A78')這種寫法也可
- 跟寫入Excel文件過程類似,將Excel中的名稱變量寫回每個對應的文件也需要用到循環(huán)。這里為了不破壞原有文件,我們選擇copyfile函數(shù)把文件復制為新文件到其他地址。
for i=1:LengthFiles
x1= Files(i).name;
x2= file_id{i};
%注意此處是大括號而不是小括號因為file_id(i)是cell類型但是file_id{i}是string類型
copyfile([path x1],['D:\處理好的數(shù)據(jù)\' x2]);
%復制到“處理好的數(shù)據(jù)”文件夾中,請確保該路徑有相應文件夾
end
這樣名稱就修改完了。在“處理好的數(shù)據(jù)”文件夾中就有復制且改完名稱的數(shù)據(jù)文件。
總結
可以用matlab通過dir函數(shù)和循環(huán)批量對文件重命名,重命名的格式可以自己在程序中設定(方案一),也可以在中途借助Excel文件設定(方案二)。方案二重命名自由度會大一些,而方案一只能給文件加上統(tǒng)一格式的前綴(比如數(shù)字序號)等內(nèi)容。
大家可以視情況自由選擇。
最后附上方案一和二的完整代碼:
方案一:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 本程序是用于對一個文件夾里面特定類型的文件進行固定排序,即本來文件夾里 %%%%
%%% 面文件的順序是按照你想要的順序排列的(比如修改時間排序),但是你擔心以 %%%%
%%% 后做出一些其他修改會改變固有的順序,而文件本身又沒有按照數(shù)字標序,則需 %%%%
%%% 程序執(zhí)行對文件進行標序來固定排序。所以本程序的作用就是固定文件排序。%%%%%%%
%%% author:yetwanng; date:2018-07-14%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
path ='D:\my_data-201508-201710\test-data\IV-test\20170702\';
%此處path是你需要重命名文件所在的完整路徑。應當注意文件地址中不要出現(xiàn)空格,否則程序會報錯
Files= dir(strcat(path,'*.xlsx'));
%利用dir函數(shù)讀取相應路徑下的特定文件名,我的是xlsx文件
for i=1:length(Files)
x1=Files(i).name;%取出第一個文件的名稱
a = sprintf('%03d',i);%類似‘0001’為前綴的命名方式,數(shù)字依次遞增
x2=num2str(a);%轉為字符串
x3=strcat(x2,'-',x1);
copyfile([path x1],['D:\處理好的數(shù)據(jù)\' x3]);%復制到“處理好的數(shù)據(jù)”文件夾中
end
clear;
clc;
方案二(上):
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 本程序是用于對一個文件夾里面特定類型的文件名進行批量提取,然后進行批量 %%%%
%%% 修改。即先讀取指定路徑下的特定類型文件的全部名字,并把名字存在數(shù)組變量 %%%%
%%% 中,然后把數(shù)組變量寫到Excel文件中去,方便自己來修改。%%%%%%%%%%%%%%%%%%%%
%%% author:yetwanng; date:2018-07-14%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
path ='D:\my_data-201508-201710\test-data\IV-test\20170702\';
%此處path是你需要重命名文件所在的完整路徑。應當注意文件地址中不要出現(xiàn)空格,否則程序會報錯
Files = dir(strcat(path,'*.xlsx'));
%利用dir函數(shù)讀取相應路徑下的特定文件名,我的是xlsx文件
LengthFiles = length(Files);
for i = 1:LengthFiles
d=Files(i).name;
f(i)=cellstr(d);%轉化為字符串再進行賦值
end
f=f.';%轉置一下
xlswrite('C:\Users\ye\Desktop\matlab_rename_data.xlsx',f,'sheet1','A1');
%先將名字數(shù)據(jù)寫入Excel數(shù)據(jù)中,以便后續(xù)在Excel中修改數(shù)據(jù),再將修改好的數(shù)據(jù)重新讀取
clear;
clc;
方案二(下):
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 本程序是承接files_rename_read程序,在其讀取了文件名字寫入Excel文件中 %%%%
%%% 然后在Excel修改完名稱后,本程序是用于將修改完后的Excel文件中的名字變 %%%%%
%%% 量重新給對應文件命名。為了不破壞原本的文件,選擇新的文件夾,將文件完整 %%%%
%%% 的復制為重新命名后的文件。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% author:yetwanng; date:2018-07-14%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
path ='D:\my_data-201508-201710\test-data\IV-test\20170702\';
%需要重命名的文件所在的地址。此處應當注意文件地址中不要出現(xiàn)空格,否則程序會報錯
Files = dir(strcat(path,'*.xlsx'));
%利用dir函數(shù)讀取相應路徑下的特定文件名,我的是xlsx文件
[data,file_id] = xlsread('C:\Users\ye\Desktop\matlab_rename_data.xlsx', 'sheet1', 'A1:A78');
%重新讀取的修改好的名字變量。
%這里可以指定讀取的具體單元格
%比如采用xlsread('PATH', 'sheet1', 'A1:A78')這種寫法也可
LengthFiles = length(Files);
for i=1:LengthFiles
x1= Files(i).name;
x2= file_id{i};
%注意此處是大括號而不是小括號因為file_id(i)是cell類型但是file_id{i}是string類型
copyfile([path x1],['D:\處理好的數(shù)據(jù)\' x2]);
%復制到“處理好的數(shù)據(jù)”文件夾中,請確保該路徑有相應文件夾
end
clear;
clc;
