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

时间:2010-01-21 23:30:55

标签: python windows case filenames

尽管Windows不区分大小写,但它确实保留了文件名中的大小写。在Python中,有没有办法在文件系统中存储带有大小写的文件名?

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

6 个答案:

答案 0 :(得分:8)

这是最简单的方法:

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

答案 1 :(得分:5)

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

win32api.GetLongPathNameW(win32api.GetShortPathName(path))

答案 2 :(得分:1)

>>> import os
>>> os.listdir("./")
['FiLeNaMe.txt']

这会回答你的问题吗?

答案 3 :(得分:1)

您可以使用:

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'是小写的。如果不是,你必须先将它转换为小写。

答案 4 :(得分:1)

如果你想递归目录

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 )

答案 5 :(得分:0)

这只是标准的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:)上关闭短文件名生成时 - 至少对于性能关键文件系统recommended,当没有16位应用程序依赖它时:

fsutil.exe behavior set disable8dot3 1