Последние строки не должны начинаться с косой черты. Если они начинаются с косой черты, то они считаются «абсолютным путем», и все, что перед ними, отбрасывается.
Цитирование документов Python дляos.path.join
:
Если компонент является абсолютным путем, все предыдущие компоненты отбрасываются, и соединение продолжается с компонента абсолютного пути.
Обратите внимание на Windows, поведение по отношению к буквам дисков, которое, кажется, изменилось по сравнению с более ранними версиями Python:
В Windows буква диска не сбрасывается при обнаружении компонента абсолютного пути (например, r'\foo'
). Если компонент содержит букву диска, все предыдущие компоненты отбрасываются и буква диска сбрасывается. Обратите внимание, что поскольку для каждого диска существует текущий каталог, он os.path.join("c:", "foo")
представляет путь относительно текущего каталога на диске C:
( c:foo
), а не c:\foo
.
os.path.normpath
для достижения этой цели.Идея
os.path.join()
состоит в том, чтобы сделать вашу программу кроссплатформенной (linux / windows / etc).Даже один слэш разрушает его.
Так что это имеет смысл только при использовании с какой-то точкой отсчета, например
os.environ['HOME']
илиos.path.dirname(__file__)
.источник
os.path.join()
может использоваться совместно сos.path.sep
созданием абсолютного, а не относительного пути.источник
os.path.sep
в качестве первого элемента для построения абсолютного пути лучше, чем любой другой ответ здесь! Весь смысл использованияos.path
вместо основных методов str состоит в том, чтобы избежать написания/
. Размещение каждого подкаталога в качестве нового аргумента и удаление всех слешей также прекрасно. Вероятно, было бы неплохо убедиться с помощью проверки,todaystr
которая не начинается с косой черты! ;)Не используйте прямую косую черту в начале компонентов пути, за исключением случаев обращения к корневому каталогу:
см. также: http://docs.python.org/library/os.path.html#os.path.join
источник
Чтобы понять, почему это удивительное поведение не совсем ужасно, рассмотрим приложение, которое принимает имя файла конфигурации в качестве аргумента:
Если приложение выполняется с:
Конфиг файл
/etc/myapp.conf/foo.conf
будет использоваться.Но подумайте, что произойдет, если приложение вызывается с помощью:
Затем
myapp
следует использовать файл конфигурации в/some/path/bar.conf
(а не/etc/myapp.conf/some/path/bar.conf
или аналогичный).Это может быть не очень хорошо, но я считаю, что это мотивация для абсолютного пути поведения.
источник
Это потому, что ваш
'/new_sandbox/'
начинается с/
и, следовательно, предполагается, что относительно корневого каталога. Удалить ведущий/
.источник
Чтобы сделать вашу функцию более переносимой, используйте ее следующим образом:
или
источник
Попробуйте комбинировать
split("/")
и*
для строк с существующими объединениями.Как это устроено...
split("/")
превращает существующий путь в список:['', 'home', 'build', 'test', 'sandboxes', '']
*
перед списком разбивает каждый элемент списка свой параметристочник
Попробуйте
new_sandbox
только систочник
делай так, без лишних косых черт
источник
Обратите внимание, что подобная проблема может укусить вас, если вы используете,
os.path.join()
чтобы включить расширение, которое уже включает в себя точку, что происходит автоматически, когда вы используетеos.path.splitext()
. В этом примере:Несмотря на то,
extension
что.jpg
вы можете получить папку с именем «foobar», а не файл с именем «foobar.jpg». Чтобы предотвратить это, вам нужно добавить расширение отдельно:источник
Вы можете :
strip
'/'
источник
Я бы порекомендовал убрать из второй и следующих строк строку
os.path.sep
, чтобы они не интерпретировались как абсолютные пути:источник
более полная версия:
источник
"\"
? Тогда ваш первый примерos.path.join("a", *"/b".split("\\"))
, который дает"/b"
... Я сомневаюсь, что это намеченный результат.