Python string.replace()不替换字符

Python string.replace()不替换字符,python,string,str-replace,Python,String,Str Replace,一些背景信息:我工作的地方有一个古老的基于web的文档数据库系统,几乎全部由带有“普通”扩展名(.doc、.xls、.ppt)的MS Office文档组成。它们都是基于某种任意ID号(即1245.doc)命名的。我们正在切换到SharePoint,我需要重命名所有这些文件并将它们排序到文件夹中。我有一个包含各种信息的CSV文件(比如哪个ID号对应于哪个文档的标题),所以我用它来重命名这些文件。我编写了一个简短的Python脚本,用于重命名ID号标题 但是,文档的某些标题在文件标题中有斜杠和其他可

一些背景信息:我工作的地方有一个古老的基于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, "_")
bad\u字符=[“/”、“\\”、“:”、“(“,”)、“,”、“|”、“?”、“*”]
对于使用坏字符的字母:
文件名=第[2]行。替换(字母“\”)
foldername=第[5]行。替换(字母“\”)
  • 行[2]
    示例:“无聊无聊的无聊-会议2/19/2008.doc”
  • 行[5]
    示例:“商务会议2/2008”
当我在
for
循环中添加
print letter
时,它将打印出它应该替换的字母,但实际上不会像我希望的那样用下划线替换该字符


这里有什么我做错了吗?

在循环的每次迭代中,您都要重新分配到
文件名
文件夹名
变量。实际上,只有
*
被替换。

这是因为
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(“”,第[2]行)
文件夹=p.sub(“”,第[5]行)

您应该看看python字符串方法
translate()
具有

编辑此内容以根据下面的评论建议添加示例:
import string
toreplace=''.join(["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]) 
underscore=''.join( ['_'] * len(toreplace))
transtable = string.maketrans(toreplace,underscore)
filename = filename.translate(transtable)
foldername = foldername.translate(transtable)
导入字符串
toreplace=''。连接([“/”、“\\”、“:”、“(“,”)、“,”、“?”、“*”)
下划线=''.join(['.']*len(toreplace))
transtable=string.maketrans(替换,下划线)
filename=filename.translate(transtable)
foldername=foldername.translate(transtable)

可以通过使用类似“/\:,”等的替换来简化,我只是使用了上面给出的内容

您从基线开始,而不是保存替换的结果,因此您得到的结果与

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, "_")
bad\u字符=[“/”、“\\”、“:”、“(“,”)、“,”、“|”、“?”、“*”]
文件名=第[2]行
foldername=行[5]
对于使用坏字符的字母:
filename=filename.replace(字母“\”)
foldername=foldername.replace(字母“25;”)
应使用string.replace(str、fromStr、toStr)

bad\u字符=[“/”、“\\”、“:”、“(“,”)、“,”、“|”、“?”、“*”]
对于使用坏字符的字母:
filename=string.replace(第[2]行,字母“\”)
foldername=string.replace(第[5]行,字母,“\”)

切题:您考虑过使用正则表达式吗?@all-谢谢您的解释。真不敢相信我忽略了这一点。(星期四…)可能有理由不更改第[2]行和第[5]行。您能在当前上下文中举个例子吗?
bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
filename = line[2]
foldername = line[5]
for letter in bad_characters:
    filename = filename.replace(letter, "_")
    foldername = foldername.replace(letter, "_")
bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
    filename = string.replace(line[2], letter, "_")
    foldername = string.replace(line[5], letter, "_")