2013-08-08 5 views
4

У меня есть следующий вывод Python os.path из IPythonos.path.join в python возвращает «неправильный» путь?

import os.path as path 
path.join("/", "tmp") 
Out[4]: '/tmp' 
path.join("/", "/tmp") 
Out[5]: '/tmp' 
path.join("abc/", "/tmp") 
Out[6]: '/tmp' 
path.join("abc", "/tmp") 
Out[7]: '/tmp' 
path.join("/abc", "/tmp") 
Out[8]: '/tmp' 
path.join("def", "tmp") 
Out[10]: 'def/tmp' 

Я нахожу выходы 5, 6, 7 и 8, чтобы быть противоречит здравому смыслу. Может кто-нибудь объяснить, есть ли конкретная причина для этой реализации?

+0

Обратите внимание, что нет никакой причины, чтобы иметь абсолютный путь как не первый аргумент для 'join'. 'join' предназначен для создания * a * пути с учетом его компонентов. Нет пути имеет абсолютные пути как «подпуть». Что вы ожидаете от «join» («/», «/ tmp») '? – Bakuriu

+0

имеет смысл! я думаю, это оправдывает реализацию хорошо! благодаря! –

ответ

15

От os.path.join() documentation:

Регистрация один или несколько компонентов пути разумно. Если какой-либо компонент является абсолютным путем, все предыдущие компоненты (в Windows, включая предыдущую букву диска, если они есть), удаляются, а соединение продолжается.

A / в начале составляет /tmp абсолютный путь.

Если вы хотите объединить несколько элементов пути, которые возможно содержат ведущую разделитель пути, а затем раздеться эти первые:

os.path.join(*(elem.lstrip(os.sep) for elem in elements)) 

Специальные обсадных абсолютные пути позволяет вам указать либо относительный путь (из родительского каталога по умолчанию) или абсолютный путь и не нужно определять, имеете ли вы абсолютный или относительный путь при построении конечного значения.

+0

спасибо! понял это сейчас! –

3

Вторая строка не должна начинаться с /; который создает абсолютный путь . Для этого выполните следующие работали:

>>> path.join('abc/', 'tmp') 
'abc/tmp' 

Из документации Python:

Если какой-либо компонент представляет собой абсолютный путь, все предыдущие компоненты (на Windows, в том числе и в предыдущем букву диска, если был один) являются выбрасывается, и соединение продолжается.

Смежные вопросы