2015-07-22 160 views
1

此問題是此後的後續處理:Python - rename files in subfolders based on subfolder and file namePython - 根據子文件夾和文件名重命名子文件夾中的文件II

我試圖循環訪問C:\temp\中子文件夾內的文件,並以指定的方式重命名每個文件。下面是我到目前爲止的代碼:

begin program. 
import os 
path = "C:/temp/" 

for root,dirname,filename in os.walk(path): 
    for i in filename: 
     i = i.split(".") 
     first = i[1][0] 
     last = i[0][-1]  
     #print filename 
     print "My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1] 
     os.rename(filename,"My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1]) 
end program. 

當我運行線,print "My_"+last+"_"+i ...,它正確地顯示了一個名爲VA1122F.A14保存在C:\temp\11182014\文件將會被重命名爲 My_F_VA1122F_11182014.A14

然而,os.rename命令返回此錯誤:

"must be string, not list."

這似乎是由於我在os.rename命令使用「文件名」的。從我讀過的,os.rename的第一個參數應該是舊的文件名。當我運行「打印文件名」時,它確實返回了給定子文件夾中所有文件的列表,所以這個錯誤是有道理的。我似乎無法弄清楚如何一次抓取一箇舊文件名。

我也嘗試過這些,但每次返回了一個錯誤:

os.rename(os.path.join(root, filename),"My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1]) 

Error: Returns the folder where python is installed and an error about a string as left operand.

os.rename(root + os.sep + filename,"My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1]) 

Error: cannot concatenate 'str' amd 'list' objects

我已經走遍了文檔和很多帖子,但無法弄清楚什麼我失蹤。感謝您的任何幫助。

+0

作爲一個提示,你應該像'print type(filename)'那樣做一個'print'語句。我敢打賭,這不會回來'串'... – Matt

回答

2

您正試圖傳遞一個文件名列表來重命名命令。您將獲得innerloop

 
for root,dirname,filenames in os.walk(path): 
    for filename in filenames: 
     i = filename.split(".") 

單一的文件名,你可以使用

 
os.rename(os.path.join(root, filename),"My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1]) 

PS:用「+」來連接字符串不極力推薦,所以它更好地利用字符串格式化。

 
os.rename(os.path.join(root, filename),"My_{last}_{start}_{sub_fold}.{ext}".format(last=last, start=i[0], sub_fold=root.split("/")[-1], ext=i[1])) 
+0

讓我接近。 'print os.path.join(root,filename)'一次返回一個文件,例如'C:/ temp/01142014 \ VA1122F.A14'(最後一個「\」是否應該是「/」?)。 另外,當我使用'os.walk('/ tmp /')'什麼都沒有執行。所以我使用了最初的'os.walk(路徑)'。' 但是,現在我得到了「訪問被拒絕錯誤」。我在具有管理員權限的計算機上對此進行測試;但是,我將在我的工作計算機上執行此操作,因爲我不允許擁有管理員權限。這基本上是一個表演塞? – Larry

+0

我應該補充一點,我可以用os.rename重命名文件而不會出現訪問被拒絕錯誤。因此,也許這不是管理員權限問題(或者os.walk(路徑)也可以這樣做)。例如,我可以使用此代碼重命名文件,而不會出現任何錯誤:'begin program。 import os rdir ='c :/ temp/01142014 /' for num,fil in enumerate([fil for os.listdir(rdir)if fil.endswith('。B14')]): os.rename(rdir + fil,rdir + 'My_'+ fil) 結束程序。' – Larry

+0

是的,它必須是'路徑'。正在我的機器上測試。 –

相關問題