Python string.replace() 无法替换字符

15 投票
5 回答
62323 浏览
提问于 2025-04-16 03:01

一些背景信息:我所在的公司有一个很老旧的基于网页的文档数据库系统,里面几乎全是MS Office文档,文件后缀都是常见的(.doc, .xls, .ppt)。这些文件的命名方式是根据某种任意的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 时,它会打印出应该被替换的字符,但实际上并没有把那个字符替换成下划线,像我想要的那样。

我是不是哪里做错了?

5 个回答

4

你可以看看Python中的字符串方法 translate(),这个方法可以帮助你处理字符串。详细信息可以在这里找到:http://docs.python.org/library/string.html#string.translate。这个方法通常和 string.maketrans 一起使用。

我在这里加个例子,按照下面评论的建议来做:

import string
toreplace=''.join(["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]) 
underscore=''.join( ['_'] * len(toreplace))
transtable = string.maketrans(toreplace,underscore)
filename = filename.translate(transtable)
foldername = foldername.translate(transtable)

你可以通过把要替换的字符设置成像 '/\:,' 这样的形式来简化操作,我只是用了上面给出的内容。

6

你在每次循环的时候都在重新给 filenamefoldername 这两个变量赋值。实际上,只有 * 这个部分在被替换。

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])

撰写回答