天天看點

自用-matlab複制檔案到對應檔案夾

文章目錄

    • 1.需求
    • 2.思路
      • 2.1 複制的基礎功能
      • 2.2周遊源檔案夾
      • 2.3 建立目的檔案夾
      • 2.4 每個檔案複制5次
      • 2.5 要多用fprintf來檢查是不是有問題!
    • 3.代碼
    • 小結

這個代碼主要解決的是建構5折交叉驗證資料集,使之更自動,保護眼睛,保護腦細胞,自用為主。

1.需求

我現在有一個檔案夾

5折交叉驗證資料集

,太長了簡稱為

a

好了。。。裡面有5個檔案夾,

image0

,

image1

…每個檔案夾下有8個類别

class1

,

class2

,

class3

…需要把類别中的檔案都複制到一個目标檔案夾

b

,這個檔案夾是這樣的,有5個子檔案夾,命名為

1

2

3

4

,(就是第幾折),每個檔案夾下又分成2個子檔案夾

train

,

test

,每個train檔案夾下有8個類,就是

a

那邊的8個類,

a和b的關系就是:

的測試集(即

test

)就是

image0

的訓練集(即

train

)就是

image1

,

image2

,

image3

,

image4

;

1

的測試集(即

test

)就是

image1

1

的訓練集(即

train

)就是

image0

,

image2

,

image3

,

image4

;

2

的測試集(即

test

)就是

image2

2

的訓練集(即

train

)就是

image0

,

image1

,

image3

,

image4

;

3

的測試集(即

test

)就是

image3

3

的訓練集(即

train

)就是

image0

,

image1

,

image2

,

image4

;

4

的測試集(即

test

)就是

image4

4

的訓練集(即

train

)就是

image0

,

image1

,

image2

,

image3

;

自用-matlab複制檔案到對應檔案夾
自用-matlab複制檔案到對應檔案夾

因為怕錯,是以用手動的方法,結果當時花了40分鐘,就是手動把每個類的東西全選然後複制1次,粘貼5次到不同的地方,我分神了,反正一共粘貼了200次。。。,于是搞好了很久之後,決定搞個代碼,萬一下次資料集更大怎麼辦,還是讓電腦來吧

2.思路

2.1 複制的基礎功能

先搞定簡單的複制,參考這篇部落格https://blog.csdn.net/YeziTong/article/details/84942629

sourcePath = '.\Square_train';  
targetPath = '.\Square_test';  
 
fileList = dir(sourcePath);  
  
for k = 3 :5: length(fileList)  
    movefile([sourcePath,'\',fileList(k).name],targetPath);
end 
 
%copyfile([sourcePath,'\',fileList(k).name],targetPath)
           

我用到的是原部落客注釋掉的copyfile,(複制功能),for循環對我意義不大,因為實作的功能不一樣,感謝部落客染血白衣

2.2周遊源檔案夾

然後實作對原始檔案下a的檔案周遊,受第一步的啟發,其實就是不斷地取出對應路徑,再拼接起來,主要注意for循環的起點,對于如果讀出來的内容是檔案夾的話,從3開始,如果讀出的内容全是檔案的話,從1開始。

2.3 建立目的檔案夾

建構新的檔案夾b,(全空,沒有檔案),主要使用mkdir函數,class1,class2的名字我在2.周遊源檔案夾a的時候自動擷取了,感覺這樣會比較友善,當然可能并不。。。

2.4 每個檔案複制5次

把檔案一個一個複制到檔案夾b的對應位置中,其實就是再次周遊原始檔案夾a,然後對裡面的每個檔案進行5次複制,根據它的具體情況,把它複制到不同的地方。

2.5 要多用fprintf來檢查是不是有問題!

3.代碼

% 用于複制檔案夾下的檔案,人力複制粘貼可能總的要花1小時
% demo裡面的代碼是有個周遊源檔案夾的過程,demo1的代碼沒有周遊源檔案夾的過程
tic
clc
clear all


sourcePath_root = 'G:\資料集\5折交叉驗證資料集'; %資料可用


targetPath_root = 'G:\資料集\無需人為複制粘貼5折交叉驗證資料集';  
count=0;
 

%周遊源檔案夾
fileList = dir(sourcePath_root); %有檔案夾,是個length+2的列向量,是以從3開始算,1和2是.和..
% fprintf('路徑是:%s\n', sourcePath_root);
% target_leiming=cell(8,1);
for k=3:1:length(fileList)
    sourcePath_ziwenjianjia_root=[sourcePath_root,'\',fileList(k).name];%imgage0的絕對路徑
%     fprintf('路徑是:%s\n', sourcePath_ziwenjianjia_root);
    leibieList=dir(sourcePath_ziwenjianjia_root);
    for kk=3:length(leibieList) %有檔案夾,是個length+2的列向量,是以從3開始算,1和2是.和..
    leibiePath=[sourcePath_ziwenjianjia_root,'\',leibieList(kk).name];%imgage0\class1的絕對路徑
    if k==3
    target_leiming(kk-2)=string(leibieList(kk).name);%因為都是一樣的,是以目标檔案夾的類名可以一次就好
    end
    dangqianleitupianPath=dir([leibiePath,'\','*.bmp']);
        for kkk=1:1:length(dangqianleitupianPath)%沒有檔案夾,是個length的列向量,從1開始
         filenamepath=[leibiePath,'\',dangqianleitupianPath(kkk).name];
         fprintf('目前讀取的圖檔是:%s\n', filenamepath);
         img = imread([leibieFilename,'\',dangqianleitupianPath(kkk).name]); %測試:讀取每張,用來說明圖檔都可以用
         count=count+1;%測試,檢視一共讀取了多少張圖檔
        end
    end
end



%建立目的檔案夾
targetPath_root = 'G:\資料集\無需人為複制粘貼5折交叉驗證資料集';  
% if ~exist(targetPath_root)         %如果targetPath路徑不存在,則建立
%     mkdir(targetPath_root); 
% end
for j=0:4 %5折交叉有5個,因為pyhon做的原始資料集,是以命名從0開始
target_meigefoldPath=[targetPath_root,'\',num2str(j)];%檔案夾0的路徑,0表示第一折
target_meigefold_trainPath=[target_meigefoldPath,'\','train'];%0的底下有train和test兩個檔案夾
target_meigefold_testPath=[target_meigefoldPath,'\','test'];
    for jj=1:8 %每一折有8個類
        target_meigelei_trainPath(j+1,jj)=string([target_meigefold_trainPath,'\',char(target_leiming(jj))]);
        if ~exist(target_meigelei_trainPath(j+1,jj))         %如路徑不存在,則建立
             mkdir(target_meigelei_trainPath(j+1,jj)); 
        end
        target_meigelei_testPath(j+1,jj)=string([target_meigefold_testPath,'\',char(target_leiming(jj))]);
        if ~exist( target_meigelei_testPath(j+1,jj))         %如果路徑不存在,則建立
             mkdir( target_meigelei_testPath(j+1,jj)); 
        end
    end
end

%複制檔案夾imgage0檔案夾下的每個檔案都要複制5次,複制到0的test,複制到1,2,3,4的train
% 複制檔案夾imgage1檔案夾下的每個檔案都要複制5次,複制到1的test,複制到0,2,3,4的train
 
countcopy=0;

for k=3:1:length(fileList)
    sourcePath_ziwenjianjia_root=[sourcePath_root,'\',fileList(k).name];%imgage0的絕對路徑
%     fprintf('路徑是:%s\n', sourcePath_ziwenjianjia_root);
    leibieList=dir(sourcePath_ziwenjianjia_root);
    for kk=3:length(leibieList) %有檔案夾,是個length+2的列向量,是以從3開始算,1和2是.和..
    leibiePath=[sourcePath_ziwenjianjia_root,'\',leibieList(kk).name];%imgage0\class1的絕對路徑
    dangqianleitupianPath=dir([leibiePath,'\','*.bmp']);
        for kkk=1:1:length(dangqianleitupianPath)%沒有檔案夾,是個length的列向量,從1開始
         filenamepath=[leibiePath,'\',dangqianleitupianPath(kkk).name];

         for y=1:5
            if y~=(k-2) %如果image0不對應0,則入訓練集
            copyfile(filenamepath,target_meigelei_trainPath(y,kk-2));%訓練集
%             fprintf('目前正複制%s 到 %s\n', filenamepath,target_meigelei_trainPath(y,kk-2));
            else
             copyfile(filenamepath,target_meigelei_testPath(y,kk-2));%測試集
%              fprintf('目前正複制%s 到 %s\n', filenamepath,target_meigelei_testPath(y,kk-2));
            end
             countcopy=countcopy+1;%測試,檢視一共複制了多少次,應該是圖檔數x5
         end
        end
    end
end



toc

%有輸出語句來檢查 是224.986428 秒。
%沒有輸出語句 時間已過 181.491226 秒。
% 沒有周遊源檔案夾,沒有輸出語句,時間已過 160.426182 秒。



           

小結

image0 image1…——周遊變量k,k的取值為1到7,但參與到for循環的是3到7

image0裡面有8個類别,.——周遊變量kk ,kk的取值為1到10,但參與到for循環的是3到10

類别1裡面有若幹張圖檔——周遊變量kkk,kkk的取值為1到xxx

,參與到for循環的是1到xxx

目标

0,1…——周遊變量j,j的取值為1到5

0裡面有train和test,train裡面有8個類别,test裡面也有同樣的8個類别,8個類别周遊變量jj,jj的取值為1到8

y是循環5次的變量,因為每張圖檔要執行5次複制,是以y是1到5

因為是源檔案夾中周遊,然後複制,是以把相關的j,jj,y一般用k和kk,kkk表示

j=k-2

jj=kk-2

y=k-2

主要是源檔案夾和目标檔案夾的class是一樣的類别,而且順序要一樣才可以這麼做,不能說源的第1類是class1,但是目标的class1卻不是該數組的第一個元素,如果是這樣,上面的映射關系就沒有實際意義了。

繼續閱讀