尽管Windows不区分大小写,但它确实保留了文件名中的大小写。在Python中,有没有办法在文件系统中存储带有大小写的文件名?
例如,在Python程序中我有filename =“texas.txt”,但是想知道它实际上是在文件系统上存储了“TEXAS.txt”,即使这对于各种文件操作来说也是无关紧要的。
答案 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