Как понять os.path.join () python? [Дубликат]

просто добавить еще один пример того, что лямбда может сделать без использования карты:

a = 10
b = 2

var mixed = (a,b) => a * b; 
// OR
var mixed = (a,b) => { (any logic); return a * b };

console.log(mixed(a,b)) 
// 20
228
задан Kevin Guan 16 December 2015 в 05:54
поделиться

11 ответов

Последние строки не должны начинаться с косой черты. Если они начинаются с косой черты, то они считаются «абсолютным путем», и все, что перед ними, отбрасывается.

Цитирование документов Python для os.path.join :

Если компонент является абсолютным путем, все предыдущие компоненты отбрасываются, а объединение продолжается от компонента абсолютного пути.

Примечание о Windows, поведение по отношению к буквы букв, которые, по-видимому, изменились по сравнению с более ранними версиями Python:

В Windows буква диска не сбрасывается при обнаружении компонента абсолютного пути (например, r'\foo'). Если компонент содержит букву диска, все предыдущие компоненты выбрасываются, и буква диска сбрасывается. Обратите внимание, что поскольку для каждого диска существует текущий каталог, os.path.join("c:", "foo") представляет путь относительно текущего каталога на диске C: (c:foo), а не c:\foo.

306
ответ дан Craig McQueen 18 August 2018 в 05:20
поделиться
  • 1
    -1: Строка No должна включать в себя символ /. Одна цель os.path.join состоит в том, чтобы не помещать какие-либо слэши в путь. – S.Lott 22 December 2009 в 13:29
  • 2
    Проблема с str.join (), конечно же, в том, что она не устранит двойные косые черты. Я думаю, что это основная цель для людей, использующих os.path.join. например '/'.join(['/etc/', '/ conf']) приводит к трем слэшам: '/ etc /// conf' – Dustin Rasener 31 July 2012 в 15:03
  • 3
    @DustinRasener Вы можете использовать os.path.normpath для достижения этой цели. – Gareth Latty 28 October 2012 в 19:48
  • 4
    не знаю, почему люди расстраиваются по поводу поведения os.path.join. В других языках эквивалентная библиотека / метод path-join ведет себя точно так же. Это безопаснее и имеет больше смысла. – mmcrae 4 December 2014 в 18:41
  • 5
    Это расстраивает, потому что это неявная магия , вопреки кардинальной эвристике слова «Явный лучше, чем неявный». И это есть . Дизайнеры языка могут полагать, что они знают лучше, но существуют очевидные и очевидные причины, из-за которых иногда хочется это сделать. Теперь мы не можем. Вот почему мы не можем иметь хорошие вещи. – Cecil Curry 18 August 2015 в 05:54

Это потому, что ваш '/new_sandbox/' начинается с / и, следовательно, считается относительно корневого каталога. Удалите ведущий /.

11
ответ дан Amber 18 August 2018 в 05:20
поделиться

Идея os.path.join() заключается в том, чтобы сделать вашу программу кросс-платформенной (linux / windows / etc).

Даже одна косая румяна.

Так что это имеет смысл при использовании с некоторой точкой отсчета, подобной os.environ['HOME'] или os.path.dirname(__file__).

128
ответ дан Antony Hatchkins 18 August 2018 в 05:20
поделиться

Чтобы понять, почему это удивительное поведение не является полностью ужасным, рассмотрите приложение, которое принимает имя файла конфигурации в качестве аргумента:

config_root = "/etc/myapp.conf/"
file_name = os.path.join(config_root, sys.argv[1])

Если приложение выполняется с:

$ myapp foo.conf

Будет использоваться файл конфигурации /etc/myapp.conf/foo.conf.

Но подумайте, что произойдет, если приложение вызвано с помощью:

$ myapp /some/path/bar.conf

Затем myapp должен использовать файл конфигурации в /some/path/bar.conf (а не /etc/myapp.conf/some/path/bar.conf или аналогичный).

Это может быть не очень хорошо, но я считаю, что это мотивация для поведения абсолютного пути.

8
ответ дан David Wolever 18 August 2018 в 05:20
поделиться

сделать это так, без лишних косых черт

root="/home"
os.path.join(root,"build","test","sandboxes",todaystr,"new_sandbox")
3
ответ дан ghostdog74 18 August 2018 в 05:20
поделиться

Попробуйте только new_sandbox

os.path.join('/home/build/test/sandboxes/', todaystr, 'new_sandbox')
4
ответ дан Kevin Guan 18 August 2018 в 05:20
поделиться

Не использовать косые черты в начале компонентов пути, за исключением случаев, когда они ссылаются на корневой каталог:

os.path.join('/home/build/test/sandboxes', todaystr, 'new_sandbox')

см. также: http://docs.python.org/library /os.path.html#os.path.join

14
ответ дан miku 18 August 2018 в 05:20
поделиться

Чтобы сделать вашу функцию более переносимой, используйте ее как таковой:

os.path.join(os.sep, 'home', 'build', 'test', 'sandboxes', todaystr, 'new_sandbox')

или

os.path.join(os.environ.get("HOME"), 'test', 'sandboxes', todaystr, 'new_sandbox')
7
ответ дан NuclearPeon 18 August 2018 в 05:20
поделиться

Попробуйте комбо split("/") и * для строк с существующими соединениями.

import os

home = '/home/build/test/sandboxes/'
todaystr = '042118'
new = '/new_sandbox/'

os.path.join(*home.split("/"), todaystr, *new.split("/"))

Как это работает ...

split("/") превращает существующий путь в список: ['', 'home', 'build', 'test', 'sandboxes', '']

* перед списком разбивает каждый элемент списка на свой собственный параметр

1
ответ дан openwonk 18 August 2018 в 05:20
поделиться

Обратите внимание, что подобная проблема может вас укусить, если вы используете os.path.join() для включения расширения, которое уже содержит точку, что происходит автоматически, когда вы используете os.path.splitext(). В этом примере:

components = os.path.splitext(filename)
prefix = components[0]
extension = components[1]
return os.path.join("avatars", instance.username, prefix, extension)

Хотя extension может быть .jpg, вы получите папку с именем «foobar», а не файл «foobar.jpg». Чтобы этого не произошло, вам необходимо добавить расширение отдельно:

return os.path.join("avatars", instance.username, prefix) + extension
0
ответ дан shacker 18 August 2018 в 05:20
поделиться

os.path.join() может использоваться совместно с os.path.sep для создания абсолютного, а не относительного пути.

os.path.join(os.path.sep, 'home','build','test','sandboxes',todaystr,'new_sandbox')
59
ответ дан wim 18 August 2018 в 05:20
поделиться
  • 1
    Использование os.path.sep в качестве первого элемента для построения абсолютного пути лучше, чем любой другой ответ здесь! Весь смысл использования os.path, а не базовых методов str, заключается в том, чтобы избежать записи /. Также отлично подходит для каждого подкаталога в качестве нового аргумента и удаления всех косых черт. Вероятно, было бы неплохо убедиться, что проверка todaystr не начинается с косой черты! ;) – snooze92 23 January 2014 в 10:59
  • 2
    Это работает и на окнах (python 2.7.6). Он не мешал «C: \» и входил в подкаталоги. – rickfoosusa 2 February 2015 в 22:22
Другие вопросы по тегам:

Похожие вопросы: