2013-06-23 41 views
3

我只是寫一個Python腳本來擺脫在文件名中的一些惱人的後綴,的Python os.rename和os.walk一起

這裏是我的代碼:

import os 

for root, dirs, files in os.walk("path"): 

    for filename in files: 

     if filename.endswith("[AnnoyingTag].mov"): 

      os.rename(filename, filename[:-18]+'.mov') 

,但我在得到了錯誤最後一行:

OSError: [Errno 2] No such file or directory 

我很確定我有正確的路徑,因爲我可以正確打印所有文件名。

......真的不知道爲什麼這不起作用。

謝謝您的回答

+0

'list(os.walk(「path」))' – JBernardo

+0

爲什麼不在調用重命名之前打印文件名?嘗試調試。 –

+0

我做了,它正確地打印出所有的文件名。我試過類型(文件名),他們都返回字符串。 –

回答

8

您可以

os.rename(root + os.sep + filename, root + os.sep + filename[:-18]+'.mov') 
+0

謝謝!有用。但我可以進一步詢問爲什麼原始代碼可以工作嗎? –

+1

在os.rename函數中,您必須提供完整路徑,否則會在您的腳本被調用的目錄中搜索文件。我不太清楚'你的意思是爲什麼原始代碼會起作用。 –

+0

哦,我的意思是不會。感謝您的解釋,我學到了很多 –

1

修正:

import os 

for root, dirs, files in os.walk("path"): 
    for filename in files: 
     if filename.endswith("[AnnoyingTag].mov"): 
      os.rename(root+'\\'+filename, root+'\\'+filename[:-18]+'.mov') 

我覺得你的問題是,你要重命名的文件不在當前工作目錄。

10

更換

os.rename(filename, filename[:-18]+'.mov') 

的首選方式加入路徑是使用os.path.join,改變這一行:

os.rename(filename, filename[:-18]+'.mov') 

這種替換:

os.rename(os.path.join(root, filename), os.path.join(root, filename[:-18]+'.mov')) 
+0

謝謝!有用。但我可以進一步詢問爲什麼原始代碼可以工作嗎? –