2010-01-21 2 views
13

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

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

+0

(случайно повторяющиеся счета объединены) –

ответ

8

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

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

Это не сработало для меня - я все равно получаю «texas.txt». – diggums

+1

Does 'win32api.GetLongPathName (win32api.GetShortPathName ('texas.txt'))' work? –

+2

Да, это работает. На самом деле, чтобы прояснить, ваше первоначальное предложение действительно работает, но не включает в себя каталог - например, 'win32api.GetLongPathName ('\\ states \\ texas.txt')' дает '' \\ states \\ TEXAS.txt'' , тогда как 'win32api.GetLongPathName (win32api.GetShortPathName ('\\ states \\ texas.txt))' правильно выводит '' \\ STATES \\ TEXAS.txt''.Это меня смутило, теперь я все настроен. Благодаря! – diggums

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

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

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

+2

'print ([f для f в os.listdir (" mydirpath "), если f.lower() ==" texas.txt "] + [" file not found "]) [0]' – 2010-01-22 00:03:09

+0

@Roger: Haha , качественный товар! Я по-прежнему разбираюсь в силе понимания списков. Я склонен не публиковать ответы на один лайнер, потому что они часто могут быть более запутанными, чем освещающими :). –

+0

Просто примечание: больше не нужно использовать string.lower(). – ghostdog74

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

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

win32api.GetLongPathNameW(win32api.GetShortPathName(path)) 
+2

Хорошая точка (применимо к Python 2.x - не требуется на 3.x, что является естественным Unicode). Чтобы быть явным: входной путь (тоже) должен быть строкой Unicode (например, 'u'texas.txt''). – mklement0

+0

Смотрите мой комментарий к http://stackoverflow.com/a/2114975/179715; это не гарантируется, если короткое имя файла отключено. – jamesdlin

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 по крайней мере, для критических файловых систем производительности, когда нет 16bit приложений полагаются больше на том, что:

fsutil.exe behavior set disable8dot3 1 
Смежные вопросы