Python os.путь.join () в списке


Я могу сделать

>>> os.path.join("c:/","home","foo","bar","some.txt")
'c:/homefoobarsome.txt'

но, когда я делаю

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(s)
['c:/', 'home', 'foo', 'bar', 'some.txt']

что мне здесь не хватает?

5 55

5 ответов:

проблема os.path.join Не нужно list в качестве аргумента, это должны быть отдельные аргументы.

вот тут *, оператор "splat" вступает в игру...

Я могу сделать

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\foo\bar\some.txt'

предполагая, что join не был разработан таким образом (что это, как указал ATOzTOA), и он взял только два параметра, вы все равно можете использовать встроенный reduce:

>>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"])
'c:/home\foo\bar\some.txt'

тот же вывод, как:

>>> os.path.join(*["c:/","home","foo","bar","some.txt"])
'c:/home\foo\bar\some.txt' 

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

подсказка для Python 3 Для Python 3, reduce был перенесен на functools модуль.

Я споткнулся о ситуацию, когда список может быть пуст. В таком случае:

os.path.join('', *the_list_with_path_components)

обратите внимание на первый аргумент, который не изменит результат.

Это просто метод. Ты ничего не упустил. Элемент официальная документация показывает, что вы можете использовать распаковку списка для предоставления нескольких путей:

s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)

Примечание *s вместо просто s на os.path.join(*s). Использование звездочки вызовет распаковку списка, что означает, что каждый аргумент списка будет предоставлен функции в качестве отдельного аргумента.

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

import os
folders = [("home",".vim"),("home","zathura")]
[reduce(lambda x,y: os.path.join(x,y), each, "") for each in folders]

reduce встроен в Python 2.x. в Python 3.x он был перемещен в itertools однако принятый ответ лучше.

этот вопрос, но ответа, если у вас есть список элементов, которые нужно соединить.