Python string.replace()不替换字符

Zer*_*ime 13 python string str-replace

一些背景信息:我有一个古老的基于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, "_")
Run Code Online (Sandbox Code Playgroud)
  • 示例line[2]:"Blah blah boring - meeting 2/19/2008.doc"
  • 例如line[5]:"商务会议2/2008"

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

我有什么问题吗?

Nul*_*ion 25

这是因为filenamefoldername得到扔掉与循环的每个迭代.该.replace()方法返回一个字符串,但您没有将结果保存在任何位置.

你应该使用:

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

for letter in bad_characters:
    filename = filename.replace(letter, "_")
    foldername = foldername.replace(letter, "_")
Run Code Online (Sandbox Code Playgroud)

但我会用正则表达式来做.它更清洁,(可能)更快:

p = re.compile('[/:()<>|?*]|(\\\)')
filename = p.sub('_', line[2])
folder = p.sub('_', line[5])
Run Code Online (Sandbox Code Playgroud)


Veb*_*osa 6

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