Python:获取存储在Windows中的文件名大小写?
虽然Windows不区分大小写,但它在文件名中保留大小写。在Python中,是否有任何方法可以在文件系统中存储带有大小写的文件名 例如,在Python程序中,我有filename=“texas.txt”,但我想知道它实际上存储在文件系统中的“texas.txt”,即使这对于各种文件操作来说无关紧要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
>>> 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