os.path.join (), который не отбрасывается перед ведущей косой чертой?

os.path.join Python был описан как «в основном бессмысленный», поскольку он отбрасывает любые аргументы, предшествующие аргументу, содержащему начальную косую черту. Если оставить в стороне то, что это преднамеренное и задокументированное поведение, существует ли легкодоступная функция или шаблон кода, который не отбрасывается таким образом?

Учитывая HOMEPATH=\users\myname, следующее будет отбрасывать начало пути

print os.path.join('C:\one', os.environ.get("HOMEPATH"), 'three')

результат:

\Users\myname\three

желанный:

C:\one\Users\myname\three

Меня это несколько раз укусило, и теперь я довольно хорошо замечаю ведущую косую черту, когда это что-то, что я написал, но как насчет того, когда вы не знаете, как выглядит входящая строка, как в этом примере ?


person matt wilkie    schedule 20.02.2013    source источник
comment
Мне очень жаль, что это укусило вас несколько раз, но это преднамеренная и задокументированная функция.   -  person Martijn Pieters    schedule 21.02.2013
comment
Документы ясно дают понять, что это преднамеренное поведение, но, учитывая, что в основном бессмысленный комментарий, который я позаимствовал из связанного ответа, был одобрен 14 или более раз, я, конечно, не единственный, кто думает, что должна быть альтернатива.   -  person matt wilkie    schedule 21.02.2013
comment
Альтернативный вариант - убедиться, что ваши аргументы не начинаются с косой черты. Например. одна строка args = [a[1:] for a in args if a.startswith('\\') else a] или что-то в этом роде. Я подозреваю, что большинство людей понимают, как это должно работать. В качестве альтернативы исправьте HOMEPATH; в Windows это должно быть в корне fs, но если вы используете его по-другому, вы должны сделать так, чтобы он выглядел как относительный путь, а не как абсолютный.   -  person dash-tom-bang    schedule 21.02.2013
comment
@mattwilkie: Я комментирую, нельзя проголосовать против. Я бы так и сделал, если бы мог. Судя по качеству вопросов многих, кто впервые задает вопросы о Python, нетрудно найти 14 человек, которые неправильно понимают, почему os.path.join() это делает.   -  person Martijn Pieters    schedule 21.02.2013


Ответы (2)


Может быть _1 _... было бы тривиально написать свою собственную версию join, которая делала бы это для каждого аргумента (или второго и последующих).

person kindall    schedule 20.02.2013
comment
Я не копировал ваш ответ ;-) Просто набирал его на телефоне дольше. - person jdi; 21.02.2013

Просто уберите косую черту

path = os.environ.get("HOMEPATH").lstrip(os.path.sep)
os.path.join('C:\one', path, 'three')
person jdi    schedule 20.02.2013