Python:获取存储在Windows中的文件名大小写?

虽然Windows不区分大小写,但它确实保存大小写的文件名。 在Python中,是否有任何方法获得一个文件名的情况下,因为它存储在文件系统?

例如,在一个Python程序中,我有文件名=“texas.txt”,但是想知道它实际上存储在文件系统上的“TEXAS.txt”,即使这对于各种文件操作来说是不重要的。

这是最简单的方法:

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

我在上面的win32api解决方案中遇到了特殊字符的问题。 对于unicode文件名你需要使用:

 win32api.GetLongPathNameW(win32api.GetShortPathName(path)) 
 >>> import os >>> os.listdir("./") ['FiLeNaMe.txt'] 

这回答了你的问题了吗?

如果你想递归目录

 import os path=os.path.join("c:\\","path") for r,d,f in os.walk(path): for file in f: if file.lower() == "texas.txt": print "Found: ",os.path.join( r , file ) 

你可以使用:

 import os a = os.listdir('mydirpath') b = [f.lower() for f in a] try: i = b.index('texas.txt') print a[i] except ValueError: print('File not found in this directory') 

这当然假定你的搜索字符串'texas.txt'是小写的。 如果不是,则必须先将其转换为小写。

这个只是标准的lib,并转换所有的路径部分(驱动器号除外):

 def casedpath(path): r = glob.glob(re.sub(r'([^:/\\])(?=[/\\]|$)', r'[\1]', 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'[\1]', p)) return r and r[0] or path 

注意:它比文件系统相关的 Win API“GetShortPathName”技巧稍微慢一些,但是独立运行平台和文件系统,并且当在Windows卷上关闭短文件名生成时( fsutil.exe 8dot3name query C: – 这是推荐的至少对于没有16位应用程序依赖的性能关键文件系统来说:

 fsutil.exe behavior set disable8dot3 1