2010-08-19 59 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, "_")