Python: получить регистр имени файла как хранится в Windows? - PullRequest
14 голосов
/ 22 января 2010

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

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

Ответы [ 6 ]

8 голосов
/ 22 января 2010

Вот самый простой способ сделать это:

>>> import win32api
>>> win32api.GetLongPathName(win32api.GetShortPathName('texas.txt')))
'TEXAS.txt'
5 голосов
/ 01 октября 2011

У меня были проблемы со специальными символами с решением win32api выше. Для имен файлов Unicode вам нужно использовать:

win32api.GetLongPathNameW(win32api.GetShortPathName(path))
1 голос
/ 22 января 2010

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

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 )
1 голос
/ 22 января 2010

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

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

1 голос
/ 22 января 2010
>>> import os
>>> os.listdir("./")
['FiLeNaMe.txt']

Это отвечает на ваш вопрос?

0 голосов
/ 25 августа 2016

Это стандартная библиотека 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...