当唯一的区别是大写时,为什么 os.rename 不重命名文件?
Why is os.rename not renaming files when the only difference is capitalization?
为什么这个基本的重命名脚本没有做它应该做的事?
只是试图将每个单词的首字母大写。
import glob
import os
for filename in glob.glob("**/*.mp3", recursive = True):
withcap = str(filename).title()
print("nc " +(filename))
print("wc " +(withcap))
os.rename(filename, withcap)
打印的输出是正确的,但在 os.rename?
没有任何反应
输出:
nc BLOOD COMMAND - Return Of The Arsonist [Clean].mp3
wc Blood Command - Return Of The Arsonist [Clean].Mp3
如评论中所述,原因是您正在使用不区分大小写的文件系统。它认为新旧名称相同,所以 "rename" 变成 no-op.
您必须为每个文件重命名两次:第一次重命名为不同的临时名称;第二次重命名。然后修改为大写的实际名称。
如果您使用的操作系统具有 case-insensitive 文件系统(如 Windows),则可能会发生这种情况,其中原始名称和目标名称都已向我们显示既存在又指向同一个文件。
解决方法是通过一个不止大小写不同的临时名称重命名:
for filename in glob.glob("**/*.mp3", recursive = True):
withcap = str(filename).title()
os.rename(filename, withcap+'.tmp')
os.rename(withcap+'.tmp', withcap)
为什么这个基本的重命名脚本没有做它应该做的事? 只是试图将每个单词的首字母大写。
import glob
import os
for filename in glob.glob("**/*.mp3", recursive = True):
withcap = str(filename).title()
print("nc " +(filename))
print("wc " +(withcap))
os.rename(filename, withcap)
打印的输出是正确的,但在 os.rename?
没有任何反应输出:
nc BLOOD COMMAND - Return Of The Arsonist [Clean].mp3
wc Blood Command - Return Of The Arsonist [Clean].Mp3
如评论中所述,原因是您正在使用不区分大小写的文件系统。它认为新旧名称相同,所以 "rename" 变成 no-op.
您必须为每个文件重命名两次:第一次重命名为不同的临时名称;第二次重命名。然后修改为大写的实际名称。
如果您使用的操作系统具有 case-insensitive 文件系统(如 Windows),则可能会发生这种情况,其中原始名称和目标名称都已向我们显示既存在又指向同一个文件。
解决方法是通过一个不止大小写不同的临时名称重命名:
for filename in glob.glob("**/*.mp3", recursive = True):
withcap = str(filename).title()
os.rename(filename, withcap+'.tmp')
os.rename(withcap+'.tmp', withcap)