当唯一的区别是大写时,为什么 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)