在您的第一段代码中,fn 是一个元组,因为os.walk() 返回一个由 dirpath(字符串)、dirnames(列表)、文件名(list)组成的元组。因此,当将其分配给nn 时,nn 成为元组,而反过来使用nn.replace(k, v) 将不起作用,因为元组没有方法replace。
在您的第二段代码中,nn 现在等于fn[2](目录名列表)。不幸的是,列表也没有replace 方法。假设您要替换文件名中的所有 : 和 +,那么您需要遍历每个文件名:
我在代码中观察和更改的其他内容:
-
os.walk 返回的文件名不包含文件的完整路径,这意味着如果脚本不在与您正在重命名文件的目录相同的目录中运行,os.rename 可能找不到该文件。所以我在重命名时也加入了path。
- 在
os.rename 之后,目录中的文件将被重命名,但代码读取的文件名仍然相同。因此,您还必须更改代码中的文件名。
所以:
import os
replacements = {':': '_', '+': '_'}
for fn in os.walk('/media/ambijat/Dataworld/f23/Dropbox/ttgis'):
path = fn[0]
nn = fn[2]
for filename in nn:
newname = filename
for k, v in replacements.items():
newname = newname.replace(str(k), str(v))
if newname != filename:
os.rename(os.path.join(path, filename), os.path.join(path, newname))
filename = newname
虽然我会通过以下建议再删减一行代码:
import os
replacements = {':': '_', '+': '_'}
for path, _, filenames in os.walk('/media/ambijat/Dataworld/f23/Dropbox/ttgis'):
for filename in filenames:
newname = filename
for k, v in replacements.items():
newname = newname.replace(k, v)
if newname != filename:
os.rename(os.path.join(path, filename), os.path.join(path, newname))
filename = newname