Python string.replace() 无法替换字符
一些背景信息:我所在的公司有一个很老旧的基于网页的文档数据库系统,里面几乎全是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 个回答
你可以看看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)
你可以通过把要替换的字符设置成像 '/\:,' 这样的形式来简化操作,我只是用了上面给出的内容。
你在每次循环的时候都在重新给 filename
和 foldername
这两个变量赋值。实际上,只有 *
这个部分在被替换。
这是因为每次循环的时候,filename
和 foldername
的值都会被丢掉。.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])