[英]Python string.replace() not replacing characters
一些背景信息:我工作的地方有一个古老的基于 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]
示例:“废话无聊 - 会议 2/19/2008.doc”line[5]
示例:“商务会议 2/2008” 当我在for
循环内添加print letter
,它会打印出它应该替换的字母,但实际上不会像我想要的那样用下划线替换该字符。
我在这里做错了什么吗?
这是因为filename
和filename
foldername
filename
在循环的每次迭代中都会被丢弃。 .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])
您将在循环的每次迭代中重新分配给filename
和foldername
变量。 实际上,只有*
被替换。
你应该看看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 类似 '/\\:,' 等来简化,我只是使用了上面给出的内容
您从基线重新开始,而不是保存替换的结果,因此您将获得等效于
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, "_")
应该使用 string.replace(str, fromStr, toStr)
bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
filename = string.replace(line[2], letter, "_")
foldername = string.replace(line[5], letter, "_")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.