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

Python:获取存储在Windows中的文件名大小写?,python,windows,case,filenames,Python,Windows,Case,Filenames,虽然Windows不区分大小写,但它在文件名中保留大小写。在Python中,是否有任何方法可以在文件系统中存储带有大小写的文件名 例如,在Python程序中,我有filename=“texas.txt”,但我想知道它实际上存储在文件系统中的“texas.txt”,即使这对于各种文件操作来说无关紧要 >>> import os >>> os.listdir("./") ['FiLeNaMe.txt'] 这是否回答了您的问题?您可以使用: import os a

虽然Windows不区分大小写,但它在文件名中保留大小写。在Python中,是否有任何方法可以在文件系统中存储带有大小写的文件名

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

>>> import os
>>> os.listdir("./")
['FiLeNaMe.txt']
这是否回答了您的问题?

您可以使用:

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

如果要递归目录

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 win32api
>>> win32api.GetLongPathName(win32api.GetShortPathName('texas.txt')))
'TEXAS.txt'

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

win32api.GetLongPathNameW(win32api.GetShortPathName(path))

此文件仅为标准库文件,可转换所有路径部件(驱动器号除外):


print([f代表os.listdir(“mydirpath”)中的f,如果f.lower()==“texas.txt”]+[“未找到文件”)[0]
@Roger:哈哈,太棒了!我仍在掌握列表理解的力量。不过,我不想用一行代码来回答问题,因为它们往往比说明问题更容易混淆:)。只需注意:不再需要使用string.lower()。
except
块在功能上什么都不做,因此会默默地忽略错误。@Chinmay:仔细查看
except
块中的语句(即,程序的最后一行)。它什么也不做。(意外地合并了重复的帐户)做
win32api.GetLongPathName(win32api.GetShortPathName('texas.txt'))
work?是的,行得通。事实上,澄清一下,您最初的建议行得通,但如果包含目录,则不行-例如,
win32api.GetLongPathName('\\states\\texas.txt'))
产生
'\\states\\TEXAS.txt'
,而
win32api.GetLongPathName(win32api.GetShortPathName('\\states\\TEXAS.txt'))
正确地生成了
'\\STATES\\TEXAS.txt'
。这让我很困惑,现在我已经准备好了。谢谢!我明白了。然后,我修改了我的答案,调用
win32api.GetShortPathName
。很好的解决方案;澄清一下:需要令人费解的内部
GetShortPathName()
调用,因为
GetLongPathName()
不会对已经是long(非8.3格式)的路径进行大小写更正。在Python3.x中,即使使用非ASCII文件名,该示例也可以正常工作,但在2.x中,您必须显式使用Unicode字符串并调用
GetLongPathNameW()
(请注意
W
)相反。如果您有
pip
,则可以通过运行
pip install pypiwin32
来安装
win32api
模块(通过
pypiwin32
包),请注意,如果文件没有短文件名(如果系统或卷上禁用短文件名生成,则可能会发生这种情况),此解决方案将不起作用。此外,
GetLongPathName
将不会更正驱动器号的大小写。这一点很好(适用于Python 2.x-在3.x上不需要,3.x是本机Unicode)。只是为了明确:输入路径(也)必须是Unicode字符串(例如,
u'texas.txt'
)。请参阅我对的评论;如果禁用短文件名生成,则不能保证此操作有效。还需要保护路径中的方括号,如
copy[12]
。如果您没有,我将使用
glob.escape
来增加答案mind@robyschek是的,但是我将保护直接嵌入到sub中,因此它还支持结束
[
(如
oddfilename[
oddfilename]
)和Py 2.7&
def casedpath(path):
    r = glob.glob(re.sub(r'([^:/\\])(?=[/\\]|$)|\[', r'[\g<0>]', path))
    return r and r[0] or path
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
fsutil.exe behavior set disable8dot3 1