虽然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