Например, я хочу присоединить префиксный путь к путям ресурсов, таким как /js/foo.js.
Я хочу, чтобы полученный путь был относительно корня сервера. В приведенном выше примере, если бы префикс был «media», я бы хотел, чтобы результат был /media/js/foo.js.
os.path.join делает это очень хорошо, но способ соединения путей зависит от ОС. В этом случае я знаю, что нацелен на Интернет, а не на локальную файловую систему.
Есть ли лучшая альтернатива, когда вы работаете с путями, которые, как вы знаете, будут использоваться в URL-адресах? Будет ли os.path.join работать достаточно хорошо? Должен ли я просто свернуть свою?
os.path.join
не будет работать. Но простое присоединение по/
символу должно работать во всех случаях -/
это стандартный разделитель путей в HTTP согласно спецификации.Ответы:
Поскольку из комментариев, опубликованных OP, кажется, что он не хочет сохранять «абсолютные URL-адреса» в соединении (что является одной из ключевых задач
urlparse.urljoin
;-), я бы рекомендовал избегать этого.os.path.join
тоже было бы плохо по той же причине.Итак, я бы использовал что-то вроде
'/'.join(s.strip('/') for s in pieces)
(если ведущая часть/
также должна быть проигнорирована - если ведущая часть должна быть в специальном регистре, это, конечно, также возможно ;-).источник
os.path.join('http://media.com', 'content')
мы вернемсяhttp://media.com\content
.Вы можете использовать
urllib.parse.urljoin
:Но будьте осторожны :
Причина вы получите разные результаты ,
/js/foo.js
иjs/foo.js
потому , что бывшие начинается с косыми чертами , которая означает , что он уже начинает в корне сайта.На Python 2 вам нужно сделать
источник
urljoin
когда-либо удаляет '/'. Если я вызываю его сurlparse.urljoin('/media/', '/js/foo.js')
возвращаемым значением, будет '/js/foo.js'. Он удалил все медиа, а не дубликат '/'. Фактическиurlparse.urljoin('/media//', 'js/foo.js')
фактически возвращает '/media//js/foo.js', поэтому дубликаты не удаляются.urljoin
, не для присоединения к URL. Это для разрешения относительных URL-адресов, найденных в документах HTML и т. Д.Как вы говорите,
os.path.join
объединяет пути на основе текущей ОС.posixpath
- это базовый модуль, который используется в системах posix в пространстве именos.path
:Таким образом, вы можете просто импортировать и использовать
posixpath.join
вместо URL-адресов, которые доступны и будут работать на любой платформе .Изменить: предложение @ Pete - хорошее, вы можете псевдоним импорта для повышения читаемости
Изменить: я думаю, что это стало более ясным или, по крайней мере, помогло мне понять, если вы посмотрите на источник
os.py
(код здесь из Python 2.7.11, плюс я обрезал некоторые биты). Здесь есть условный импорт,os.py
который выбирает, какой модуль пути использовать в пространстве именos.path
. Все основные модули (posixpath
,ntpath
,os2emxpath
,riscospath
) , которые могут быть импортированы вos.py
, псевдонимами , какpath
, существуют и существуют , которые будут использоваться на всех системах.os.py
просто выбирает один из модулей для использования в пространстве именos.path
во время выполнения на основе текущей ОС.источник
from posixpath import join as urljoin
красиво псевдонимы для легкого чтения.Это прекрасно выполняет свою работу:
источник
Возможно, вы ищете функцию basejoin в пакете urllib .
Изменить: я не замечал раньше, но urllib.basejoin, похоже, напрямую сопоставляется с urlparse.urljoin, что делает последнее предпочтительным.
источник
При использовании Furl
pip install furl
это будет:источник
.url
в конце:furl.furl('/media/path/').add(path='js/foo.js').url
furl('/media/path/').add(path=furl('/js/foo.js').path).url
потому чтоfurl('/media/path/').add(path='/js/foo.js').url
есть/media/path//js/foo.js
Я знаю, что это немного больше, чем просил OP, однако у меня были фрагменты по следующему URL-адресу, и я искал простой способ присоединиться к ним:
Осмотритесь:
Итак, в дополнение к соединению пути, на которое уже был дан ответ в других ответах, Чтобы получить то, что я искал, я сделал следующее:
Согласно документации это занимает ТОЧНО кортеж из 5 частей.
Со следующим форматом кортежа:
источник
Rune Kaagaard предоставил отличное и компактное решение, которое сработало для меня, я немного расширил его:
Это позволяет объединять все аргументы независимо от конечных и конечных косых черт, сохраняя при этом последнюю косую черту, если она есть.
источник
return "/".join([str(x).strip("/") for x in args]) + trailing_slash
Чтобы немного улучшить ответ Алекса Мартелли, следующее не только удалит лишние косые черты, но и сохранит конечные (завершающие) косые черты, что иногда может быть полезно:
Однако его не так легко читать, и он не удалит несколько лишних косых черт в конце.
источник
Я обнаружил, что все вышеперечисленные решения мне не нравятся, поэтому я придумал собственное. Эта версия обеспечивает соединение частей с помощью одной косой черты и оставляет только ведущие и конечные косые черты. Нет
pip install
, никакихurllib.parse.urljoin
странностей.источник
Использование Furl и Regex (Python 3)
источник