Python os.path.dirname возвращает неожиданный путь при смене каталога

В настоящее время я не понимаю, почему питоны os.path.dirname ведут себя именно так.

Предположим, у меня есть следующий скрипт:

# Not part of the script, just for the current sample
__file__ = 'C:\\Python\\Test\\test.py'

Затем я пытаюсь получить абсолютный путь к следующему каталогу: C:\\Python\\doc\\py

С этим кодом:

base_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)) + '\\..\\doc\\py\\')

Но почему метод os.path.dirname не разрешает путь, а выводит (print (base_path):

C:\Python\Test\..\doc\py

Я ожидал, что метод разрешит путь к:

C:\Python\Test\doc\py

Я просто знаю это поведение из .NET Framework, что получение путей к каталогам всегда разрешает полный путь и удаляет изменения каталога с помощью ..\\. Что у меня есть в Python для возможности сделать это?


person BendEg    schedule 28.12.2015    source источник


Ответы (2)


Посмотрите os.path.normpath.

Нормализуйте имя пути, удалив избыточные разделители и ссылки более высокого уровня, чтобы A//B, A/B/, A/./B и A/foo/../B стали A/B. Эта манипуляция со строкой может изменить значение пути, содержащего символические ссылки. В Windows он преобразует прямую косую черту в обратную косую черту.

Причина, по которой os.path.dirname работает так, заключается в том, что он не очень умен — он работает даже для URL-адресов!

os.path.dirname("http://www.google.com/test")  # outputs http://www.google.com

Он просто отсекает все после последней косой черты. Он не смотрит ни на что до последней косой черты, поэтому ему все равно, есть ли где-то там /../.

person Martin Konecny    schedule 28.12.2015
comment
Отлично спасибо. Единственное, что было дополнительно неправильно, это то, что мне пришлось изменить: ) + '..\\doc\\py\\') на ) + '\\..\\doc\\py\\') - person BendEg; 28.12.2015

os.path.normpath() вернет нормализованный путь со всеми ссылки на текущий или родительский каталог удалены или заменены соответствующим образом.

person Ignacio Vazquez-Abrams    schedule 28.12.2015