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 ответов:
проблема
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
однако принятый ответ лучше.этот вопрос, но ответа, если у вас есть список элементов, которые нужно соединить.