Python:如何获取Windows中文件名的大小写?
虽然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'