Python字符串.replace()方法未替换字符

15

背景信息:我们工作中有一个古老的基于Web的文档数据库系统,几乎完全由“常规”扩展名(.doc、.xls、.ppt)的MS Office文档组成。它们都是根据某种任意的ID编号命名的(例如1245.doc)。我们正在切换到SharePoint,并且我需要重命名所有这些文件并将它们分类到文件夹中。我有一个CSV文件,里面有各种信息(例如哪个ID号对应哪个文档的标题),因此我使用它来重命名这些文件。我编写了一个简短的Python脚本来重命名ID号标题。

然而,一些文档的标题中包含斜线和其他可能不适合作为文件标题的字符,因此我想用下划线替换它们:

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
    filename = line[2].replace(letter, "_")
    foldername = line[5].replace(letter, "_")
  • line[2]的例子:"Blah blah boring - meeting 2/19/2008.doc"
  • line[5]的例子:"Business meetings 2/2008"

我在for循环内添加了print letter语句,它会打印出应该替换的字母,但不会像我想要的那样将该字符替换为下划线。

这里有什么问题吗?


2
旁问:您是否考虑使用正则表达式来完成这个任务? - Manoj Govindan
@全体成员 - 感谢你们的解释。真不敢相信我居然忽略了那个。(星期四的……) - aelindeman
5个回答

31

这是因为在循环的每次迭代中,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])

可能有理由不更改line[2]和line[5]。 - Kathy Van Stone

6
在循环的每次迭代中,您正在重新分配给filenamefoldername变量。实际上,只有*被替换掉了。

4
你应该查看Python字符串方法translate()http://docs.python.org/library/string.html#string.translate,并使用http://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)

可以通过将toreplace设置为类似于“/ \:,”等的内容来简化,我只是使用了上面提供的内容。


你能在当前上下文中举个例子吗? - iamgopal

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
应该使用 string.replace(str, fromStr, toStr)。
bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
    filename = string.replace(line[2], letter, "_")
    foldername = string.replace(line[5], letter, "_")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接