Python:如何获取Windows中文件名的大小写?

16 投票
6 回答
4403 浏览
提问于 2025-04-15 18:20

虽然Windows系统对大小写不敏感,也就是说它不在乎你输入的字母是大写还是小写,但它在文件名中还是会保留字母的大小写。在Python中,有没有办法获取文件名,保持它在文件系统中存储时的大小写呢?

比如,在我的Python程序中,我有一个文件名是"texas.txt",但我想知道它实际上在文件系统中是以"TEXAS.txt"的形式存储的,尽管这对各种文件操作来说可能并不重要。

6 个回答

4

这个是标准库的功能,只会转换路径中的所有部分(除了驱动器字母):

def casedpath(path):
    r = glob.glob(re.sub(r'([^:/\\])(?=[/\\]|$)|\[', r'[\g<0>]', path))
    return r and r[0] or path

而这个则可以处理UNC路径(网络路径):

def casedpath_unc(path):
    unc, p = os.path.splitunc(path)
    r = glob.glob(unc + re.sub(r'([^:/\\])(?=[/\\]|$)|\[', r'[\g<0>]', p))
    return r and r[0] or path

注意:这个方法的速度比依赖文件系统的Win API "GetShortPathName"方法稍慢,但它不依赖于平台和文件系统,也可以在Windows卷上关闭短文件名生成的情况下使用(fsutil.exe 8dot3name query C:)。后者在性能要求高的文件系统中是推荐的,前提是没有16位应用程序再依赖这个功能:

fsutil.exe behavior set disable8dot3 1
6

我在使用上面提到的win32api时遇到了特殊字符的问题。如果你要处理包含Unicode字符的文件名,你需要使用:

win32api.GetLongPathNameW(win32api.GetShortPathName(path))
10

这是最简单的方法:

>>> import win32api
>>> win32api.GetLongPathName(win32api.GetShortPathName('texas.txt')))
'TEXAS.txt'

撰写回答