15

一些背景信息: 我工作的地方有一个古老的基于 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”

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

我在这里做错了什么吗?

4

5 回答 5

30

那是因为filenameandfoldername被循环的每次迭代扔掉了。该.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])
于 2010-08-19T15:01:33.683 回答
6

您在循环的每次迭代中重新分配filename和变量。foldername实际上,只是*被替换。

于 2010-08-19T15:01:22.000 回答
4

你应该看看 python 字符串方法translate() http://docs.python.org/library/string.html#string.translatehttp://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)

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

于 2010-08-19T15:04:15.107 回答
3

您从基线重新开始,而不是保存替换的结果,因此您得到的等价于

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, "_")
于 2010-08-19T15:05:35.877 回答
1

应该使用 string.replace(str, fromStr, toStr)

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
    filename = string.replace(line[2], letter, "_")
    foldername = string.replace(line[5], letter, "_")
于 2011-08-18T16:20:32.273 回答