Matlab修改文件的文件名


其實這個Matlab修改文件名,就是要熟悉一個函數movefile,這個函數貌似有兩個功能1、移動一個文件到另外的地方(實驗顯示,具體實現的功能應該是把源地址的數據根據修改后的文件名保存到目的路徑,源地址的數據被刪除)2、就是在同一個文件夾下面對於文件進行改名。

 下面這個程序,現在是指定文件夾后,只能指定一個視頻的一種分割位置更改。還可以考慮的優化,是指定多個視頻,多個分割位置信息信息更改。不過貌似這樣改運算量會大很多。以后再說吧

clear;close all;clc;
%由於數據采集階段編寫了兩個matlab代碼一起操作,來處理數據。
%前一個Matlab程序是用來從視頻中截取數據的。后一個是用來挑選數據的類別。
%前后兩個程序的命名規則是不同的。
%前178 4_000001.jpg。文件命名規則:視頻序號+空格+數據位置+'_'+視頻幀號。
%而有這個空格號,當初也是考慮到strtok函數更好分割文件名。但caffe中不能識別有空格號的文件名。所以必須改
%后col_185-4-zz-_000413.jpg。文件命名規則:col+'_'+視頻序號+'-'+數據位置+'-'+分割位置標記+'-'+幀號
%現在感覺這挑選后的文件名,這里面'_''-'太多了,雖然這當初考慮是為了方便看各個數據,而且caffe不能識別有空格的label
%所以才加了那么多。但最后的_000413,就是把原文件名拆掉然后來看,這里面連着'-''_',確實是有點不好看。
%至於以后怎么考慮更好的命名規則,以后再說了。現在的任務就是把文件夾中的前面這種命名規則挑選出來,並改為后面這種命名規則的文件名
%%
%程序設計上考慮數據保存的實際情況,數據根據各個類別放在不同的文件夾里面。
%所以程序設計上,就是讀取路徑文件夾下面的所有子文件夾的數據,然后改名

%每次運行程序,需要修改的變量如下
changeVedio='178';

fgwzbj='zz';

dirPath='C:\Users\Dy\Desktop\彩色視頻真實數據\sj3';%數據路徑


%%
%讀取文件夾列表,但這種方式讀取會保留原文件.(在結構體中第一個)和上一層目錄..(在結構體第二個)。所以真正的數據文件夾從第3個開始
dirList=dir(dirPath);
countList=length(dirList);%文件夾個數
for numList=3:countList%文件夾從3開始,目錄中.和..在第一和第二,應該是某種規則
    %根據這個過濾掉在此文件夾可能存在的txt文件
    %由於這里面保存數據的文件夾都是0,123..所有用了下面的判斷
    if(length(dirList(numList).name)>=2)
        continue;
    end
    fileNameList=dir([dirPath,'\',dirList(numList).name]);%讀取子文件夾中的圖片
    fileSum=length(fileNameList);%統計子文件夾中的文件個數
    
    for fileNum=3:fileSum%文件從3開始
        %由於對於不同的視頻改寫的文件名不同,所以要先進行判斷,到底是不是要改的文件
        %原始圖像的文件名為類似於178 4_000001.jpg形式的
        %
        [spxh,~]=strtok(fileNameList(fileNum).name);%由於前一個程序設定的命名規則,所以由默認的空格符號分割文件名,得到前面的視頻序號
        %用函數strcmpi判斷兩個字符串是否相等,函數strcmpi相等輸出1,否則輸出0
        %如果不相等,即不是要處理的數據,進入下一個循環
        if strcmpi(spxh,changeVedio)==0
            continue;
        end
        realName=[dirPath,'\',dirList(numList).name,'\',fileNameList(fileNum).name];%依次得到具體圖片文件的完整路徑
        %前178 4_000001.jpg。文件命名規則:視頻序號+空格+數據位置+'_'+視頻幀號。
        %后col_185-4-zz-_000413.jpg。文件命名規則:col+'_'+視頻序號+'-'+數據位置+'-'+分割位置標記+'-'+幀號
        %想改成的文件名。
        sjwz=fileNameList(fileNum).name(5);
        zh=fileNameList(fileNum).name(6:end);
        changeName=[dirPath,'\',dirList(numList).name,'\','col','_',spxh,'-',sjwz,'-',fgwzbj,'-',zh];%修改后具體圖片文件的完整路徑
        %%%主要就是下面這句更改文件名
        movefile(realName,changeName);
    end
end
%%

 

%下面這代碼是,原來得到的是RGB圖像,最開始考慮,可以生成一些灰度圖像來作為訓練集去測試。看看效果怎么樣(其實現在發現這沒用,不合理)。但當時考慮如果生成了灰度圖像,最好能在彩色圖像前面加上col前綴,因為有些圖片灰色的,看不出是彩色還是灰度。作為一個例子來看還是可以的。

clear;close all;clc;
%這個程序是寫的為了原來的文件名就是單獨的數字,但是后來考慮,可能會加入灰度圖像
%所以在彩色圖像文件名前面加上col,及col+文件名 來作為新的文件名
%繼續添加路徑
pathRead='C:\Users\Dy\Desktop\歸一化后的圖像\train9';

dirList=dir(pathRead);%讀取文件夾列表,這種方式讀取會保留原文件.(在結構體中第一個)和上一層目錄..(在結構體第二個)
countList=length(dirList);%文件夾個數
for numList=3:countList%文件夾從3開始
    %根據這個過濾掉在此文件夾可能的train.txt文件
    %由於這里面保存數據的文件夾都是0,123..所有用了下面的判斷
    if(length(dirList(numList).name)>=2)
        continue;
    end
    fileName=dir([pathRead,'\',dirList(numList).name]);%讀取子文件夾中的圖片
    fileSum=length(fileName);%統計子文件夾中的文件個數
    
    for fileNum=3:fileSum%文件從3開始
        realName=[pathRead,'\',dirList(numList).name,'\',fileName(fileNum).name];%依次得到具體圖片文件的完整路徑
        %%%主要就是下面這句更改文件名
        changeName=[pathRead,'\',dirList(numList).name,'\','col',fileName(fileNum).name];%修改后具體圖片文件的完整路徑
        movefile(realName,changeName);
    end
end

 

下面為最開始寫的,帶吐槽。但畢竟花了時間寫,就不刪掉了。

哎 用caffe的imagenet生成數據,擦,貌似不能識別中文,原來生成的一堆中文文件名的圖像要改一堆名字去測試一下效果,哎,手動改太麻煩,用matlab試試,從網上找了個代碼。

原始的代碼如下

matlab 怎么批量的更改大量的文件名

clear;clc;

str = dir('e:\laowu2013-07-23\matlab code\My Programs\tests\RayleighWave_Viscoelastic\muller\*.bin'); % 替換成你自己的文件所在目錄
strx = struct2cell(str);
sn = length(strx(1,:));
for ix = 1:sn
    newname=sprintf('ss-%d.bin',ix);
    movefile(strx{1,ix},newname);
end

50個金幣呀,居然還是13年的。。不過看看問問題的是搞催化化學的,回答問題的是應用地球物理學的,額。。。

原文件名為類似於以下這種

方正姚體3常規0Black1.jpg 被下面程序改為類似於 0BitBlack1.jpg這種形式

個人改了改如下

clear;clc
%原來生成的數據名字都是中文的,哎,沒想到整到用imagenet的create來生成數據
%然后用cifar10來處理這一步,所以要把中文名字現在全部改為英文
file=dir('C:\Users\Dy\Desktop\實驗數據\train\one\*.jpg');%讀取文件名列表
  filecell=struct2cell(file);%把數據類型由str換為cell,不知道為啥要更換數據類型,更換后變成一個cell數組了,第一行就是文件名
  count=length(filecell(1,:));%取這個cell數組的第一行,就是這個文件名的這一行,然后列出長度,感覺閑的蛋疼,直接用length(file)直接就能出個數,還要整的那么麻煩
  for num=1:count%就是循環改名,沒啥。
    newname=sprintf(file(num).name(8:end));%貌似這個sprintf沒啥用。其實這個sprintf就是轉換為字符串形式,這個直接取出的數據,感覺就是字符串形式
    movefile(filecell{1,num},newname);%這句就是該文件名,感覺應該就是這句,這個文件必須在處理的數據的那個文件夾下面運行
end

% 感覺上面的代碼太挫了,再改
file=dir('C:\Users\Dy\Desktop\實驗數據\train\zero\*.jpg');
  count=length(file);
  for num=1:count
    newname=file(num).name(8:end);
    movefile(file(num).name,newname);%主要就是這個命令,要把m文件考到那個文件夾下面去,感覺如果繼續修改,要怎么添路徑
end

參考

1 path='C:\Users\Dy\Desktop\實驗數據\val';
2 file=dir(path);%這種方式讀取好像會保留原文件.(在結構體中第一個)和上一次目錄..(在結構體第二個),所以從第3個開始
3 count=length(file);
4 for num=3:count
5     newname=file(num).name(8:end);
6     movefile([path,'\',file(num).name],[path,'\',newname]);
7 end

好像運行這個代碼的時候,在命令窗口運行下指令時會出錯。而運行程序時沒問題,不知道什么原因,就像最開始找到的程序,沒搞懂為啥movefile函數里面為啥用cell,應該就是movefile函數沒搞懂


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM