在Python中,如何获取文件的正确大小写路径?
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]