Ответ 1
Вот простейший способ сделать это:
>>> import win32api
>>> win32api.GetLongPathName(win32api.GetShortPathName('texas.txt')))
'TEXAS.txt'
Хотя Windows нечувствительна к регистру, она сохраняет регистр в именах файлов. В Python есть ли способ получить имя файла в случае, когда он хранится в файловой системе?
Например, в программе Python у меня есть filename = "texas.txt", но вы хотите знать, что он фактически хранит "TEXAS.txt" в файловой системе, даже если это несущественно для различных операций с файлами.
Вот простейший способ сделать это:
>>> import win32api
>>> win32api.GetLongPathName(win32api.GetShortPathName('texas.txt')))
'TEXAS.txt'
У меня были проблемы со специальными символами с решением win32api выше. Для имен файлов в Юникоде вам необходимо использовать:
win32api.GetLongPathNameW(win32api.GetShortPathName(path))
>>> 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 )
Эта стандартная только 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