在Python中,如何获取文件的正确大小写路径?

32 投票
12 回答
12372 浏览
提问于 2025-04-16 04:01

Windows系统的文件名不区分大小写,所以我可以用这些不同的方式打开同一个文件:

r"c:\windows\system32\desktop.ini"
r"C:\WINdows\System32\DESKTOP.ini"
r"C:\WiNdOwS\SyStEm32\DeSkToP.iNi"

那么,给定这些路径,我该如何找到文件名的真实大小写呢?我希望它们都能显示:

r"C:\Windows\System32\desktop.ini"

os.path.normcase这个方法不行,它只是把所有字母都变成小写。os.path.abspath可以返回一个绝对路径,但这些路径本身已经是绝对路径了,所以它不会改变任何一个路径。os.path.realpath主要是用来处理符号链接的,而Windows没有符号链接,所以在Windows上它和abspath是一样的。

有没有简单的方法可以做到这一点呢?

12 个回答

11

在Python 3中,你可以使用pathlib里的resolve()方法:

>>> from pathlib import Path

>>> str(Path(r"C:\WiNdOwS\SyStEm32\DeSkToP.iNi").resolve())
r'C:\Windows\System32\desktop.ini'
13

Ned的GetLongPathName这个回答对我来说不太管用。你需要在GetShortPathname的返回值上调用GetLongPathName。为了简化,我用pywin32来演示(如果用ctypes,效果和Ned的差不多):

>>> win32api.GetLongPathName(win32api.GetShortPathName('stopservices.vbs'))
'StopServices.vbs'
7

这里有一个简单的解决方案,只用到了标准库:

import glob
def get_actual_filename(name):
    name = "%s[%s]" % (name[:-1], name[-1])
    return glob.glob(name)[0]

撰写回答