Подтвердить что ты не робот

Python: получение имени файла, хранящегося в Windows?

Хотя Windows нечувствительна к регистру, она сохраняет регистр в именах файлов. В Python есть ли способ получить имя файла в случае, когда он хранится в файловой системе?

Например, в программе Python у меня есть filename = "texas.txt", но вы хотите знать, что он фактически хранит "TEXAS.txt" в файловой системе, даже если это несущественно для различных операций с файлами.

4b9b3361

Ответ 1

Вот простейший способ сделать это:

>>> import win32api
>>> win32api.GetLongPathName(win32api.GetShortPathName('texas.txt')))
'TEXAS.txt'

Ответ 2

У меня были проблемы со специальными символами с решением win32api выше. Для имен файлов в Юникоде вам необходимо использовать:

win32api.GetLongPathNameW(win32api.GetShortPathName(path))

Ответ 3

>>> import os
>>> os.listdir("./")
['FiLeNaMe.txt']

Отвечает ли это на ваш вопрос?

Ответ 4

Вы можете использовать:

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' находится в нижнем регистре. Если это не так, вам придется сначала преобразовать его в нижний регистр.

Ответ 5

и если вы хотите перезаписать каталоги

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 )

Ответ 6

Эта стандартная только 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