2010-08-19 63 views
11

一些背景信息:我們有一個古老的基於Web的文檔數據庫系統,我的工作幾乎完全由MS Office文檔組成,具有「常規」擴展名(.doc,.xls, .PPT)。它們都是基於某種任意ID號命名的(即1245.doc)。我們正在切換到SharePoint,我需要重命名所有這些文件並將它們分類到文件夾中。我有一個包含各種信息的CSV文件(比如哪個ID號對應哪個文件的標題),所以我用它來重命名這些文件。我寫了一個簡短的Python腳本,重新命名ID號標題。Python string.replace()不能替換字符

然而,一些文件的標題有斜線和其他可能的壞字符有一個文件的標題,所以我想用下劃線代替他們:

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"] 
for letter in bad_characters: 
    filename = line[2].replace(letter, "_") 
    foldername = line[5].replace(letter, "_") 
  • line[2] 「等等等等無聊 - 會議2月19日/版本說明Page」 的line[5]
  • 例: 「商務會議2/2008」

當我添加0123在for循環中,它會打印出它應該替換的字母,但實際上並不會用我想要的下劃線替換該字符。

有什麼我在這裏做錯了嗎?

+2

切線問題:你有沒有考慮過用正則表達式來做這個? – 2010-08-19 15:03:42

+0

@all - 感謝您的解釋。我不能相信我忽略了這一點。 (thursdays ...) – ZeroUptime 2010-08-19 15:09:45

回答

23

這是因爲filenamefoldername在循環的每次迭代中都被拋棄。 .replace()方法返回一個字符串,但不會將結果保存在任何地方。

你應該使用:

filename = line[2] 
foldername = line[5] 

for letter in bad_characters: 
    filename = filename.replace(letter, "_") 
    foldername = foldername.replace(letter, "_") 

但我會使用正則表達式做。它的清潔和(可能)快:

p = re.compile('[/:()<>|?*]|(\\\)') 
filename = p.sub('_', line[2]) 
folder = p.sub('_', line[5]) 
+0

可能有一個理由不改變行[2]和行[0123] – 2010-08-19 15:06:01

+0

@Kathy好點,固定答案 – NullUserException 2010-08-19 15:13:45

6

您將在循環的每次迭代中重新分配filenamefoldername變量。實際上,只有*正在被替換。

4

你應該看看蟒蛇字符串的方法translate() http://docs.python.org/library/string.html#string.translatehttp://docs.python.org/library/string.html#string.maketrans

編輯此添加一個例子按照下面的評論建議:
import string 
toreplace=''.join(["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]) 
underscore=''.join(['_'] * len(toreplace)) 
transtable = string.maketrans(toreplace,underscore) 
filename = filename.translate(transtable) 
foldername = foldername.translate(transtable) 

可以通過取代'/ \ :,'等東西來簡化,我剛剛使用了上面給出的東西

+0

你可以給當前的情況下的例子嗎? – iamgopal 2010-08-19 15:06:48

3

你重新開始與基線而不是保存替換結果,所以你得到相當於

filename = line[2].replace('*', '_') 
foldername = line[5].replace('*', '_') 

請嘗試以下

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"] 
filename = line[2] 
foldername = line[5] 
for letter in bad_characters: 
    filename = filename.replace(letter, "_") 
    foldername = foldername.replace(letter, "_") 
1

應該使用字符串。替換(str,fromStr,toStr)

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"] 
for letter in bad_characters: 
    filename = string.replace(line[2], letter, "_") 
    foldername = string.replace(line[5], letter, "_")