Python string.replace()不替换字符

时间:2010-08-19 14:57:17

标签: python string str-replace

一些背景信息:我有一个古老的基于网络的文档数据库系统,我工作,几乎完全由具有“正常”扩展名(.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]示例:“商务会议2/2008”

当我在print letter循环中添加for时,它将打印出它应该替换的字母,但实际上并不会像我想要的那样用下划线替换该字符。

我在这里做错了吗?

5 个答案:

答案 0 :(得分:25)

这是因为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])

答案 1 :(得分:6)

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

答案 2 :(得分:4)

你应该看一下python字符串方法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)

可以通过使'/ \:,'等替换为简化,我只是使用了上面给出的内容

答案 3 :(得分: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, "_")

答案 4 :(得分: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, "_")