2012-08-11 47 views
1

使用Python與Windows我試着重新命名一次是在同一個文件夾中的幾個文件,但我不能用列表做了重新命名,這就是爲什麼我得到這個錯誤,當我嘗試我的代碼:Python,我如何根據列表重命名幾個文件?

os.rename(dirlist[1], words[1]) WindowsError: [Error 2] The system cannot find the file specified

下面是示例代碼:

import os 
import sys 
words = os.listdir('C:/Users/Any/Desktop/test') 
dirlist = os.listdir('C:/Users/Any/Desktop/test') 

words = [w.replace('E', 'e') for w in words] 
print words 

os.rename(dirlist[1], words[1]) 

我想實現的是有我的Python腳本運行選擇的文件夾和腳本將所有文件在那裏,並重新命名所有的人。但棘手的部分是當我不能單出文件夾名稱,並且因爲它們附加到列表而被重命名。

回答

3

os.listdir只會讓您回到基準名稱結果。沒有完整的路徑。它們不存在於當前的工作目錄中。您將需要加入他們回來根:

root = 'C:/Users/Any/Desktop/test' 
for item in os.listdir(root): 
    fullpath = os.path.join(root, item) 
    os.rename(fullpath, fullpath.replace('E', 'e')) 

更新

在回答你關於如何執行大更換的數量評論,我曾建議你可以使用translatemaketrans

讓我們開始我們的字典和一個源字符串:

d = {'E': 'e', 'a': 'B', 'v': 'C'} 
s = 'aAaAvVvVeEeE' 

首先,讓我告訴你一個非常原始和入門級的方法的例子:

for old, new in d.iteritems(): 
    s = s.replace(old, new) 

print s 
# BABACVCVeeee 

這個例子遍歷您字典,多次調用替換。它的工作原理很簡單,使用簡單的語法。但它有點吮吸不得不循環字典中的每個字符串,並調用多次替換。

還有很多其他的方法可以做到這一點,我敢肯定,但另一種方法是創建一個轉換表一次,然後再用它爲每一個字符串:

import string 

old, new = zip(*d.items()) 
print old, new 
# ('a', 'E', 'v') ('B', 'e', 'C') 

old_str, new_str = ''.join(old), ''.join(new) 
print old_str, new_str 
# aEv BeC 

table = string.maketrans(old_str, new_str) 

print s.translate(table) 
# BABACVCVeeee 

這將拆分字典出關鍵併爲元組賦值。然後,我們加入介紹字符串並將它們傳遞給maketrans,這會讓我們回到表格。我們只需要這樣做一次。現在我們有一個表格,可以用它來翻譯任何字符串。

+0

太棒了!非常感謝你jdi – harry 2012-08-11 18:44:10

+0

很高興幫助。除了做兩個listdir以外,還可以節省您:-) – jdi 2012-08-11 18:47:34

+0

有人低估了我?我會**愛**,聽聽爲什麼。 – jdi 2012-08-11 19:03:32

1

即將到來的錯誤,因爲你當前的工作目錄不點'C:/Users/Any/Desktop/test',默認情況下它指向c:\python27如果你使用Python 2.7版,您可以通過os.getcwd()檢查你的,所以你應該改變當前的工作目錄'C:/Users/Any/Desktop/test'應用該重命名之前。

使用os.chdir()更改當前工作目錄。

import os 
import sys 
words = os.listdir('C:/Users/Any/Desktop/test') 
dirlist = os.listdir('C:/Users/Any/Desktop/test') 

words = [w.replace('E', 'e') for w in words] 
print words 

os.chdir('C:/Users/Any/Desktop/test') #this changes the current working directory 
os.rename(dirlist[1], words[1]) 
+0

出於好奇...你沒有降低我的表現,然後在我之後發表了一個非常相似的答案嗎?沒有指責..只是問。 – jdi 2012-08-11 19:19:33

+0

@jdi爲什麼我會倒下你?我建議他使用與您的答案不相似的'os.chdir()',或者它是? – 2012-08-11 19:22:53

+0

哈。我只是在問,因爲downvote對我的回答沒有意義。在我接受之後,你添加了一些東西。想想也許你恨我:-)沒有你是一個不同的角度肯定。 – jdi 2012-08-11 19:27:05