Python os.path.join() в списке
Я могу сделать
>>> os.path.join("c:/","home","foo","bar","some.txt")
'c:/home\\foo\\bar\\some.txt'
Но, когда я делаю
>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(s)
['c:/', 'home', 'foo', 'bar', 'some.txt']
Что мне здесь не хватает?
Ответы
Ответ 1
Проблема заключается в том, что os.path.join
не принимает аргумент list
как аргумент, он должен быть отдельным аргументом.
Здесь *
, оператор "splat" вступает в игру...
Я могу сделать
>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'
Ответ 2
Предполагая, что 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
.
Ответ 3
Я наткнулся на ситуацию, когда список может быть пустым. В этом случае:
os.path.join('', *the_list_with_path_components)
Обратите внимание на первый аргумент, который не изменит результат.
Ответ 4
Это просто метод. Вы ничего не пропустили. Официальная документация показывает, что вы можете использовать распаковку списка для подачи нескольких путей:
s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)
Обратите внимание на *s
только s
в os.path.join(*s)
. Использование звездочки вызовет распаковку списка, что означает, что каждый аргумент списка будет передан функции как отдельный аргумент.
Ответ 5
Это можно также считать простой операцией уменьшения карты, если вы хотите думать об этом с точки зрения функционального программирования.
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
Однако принятый ответ лучше.
Ниже приведен ответ, но ответьте, если у вас есть список элементов, которые необходимо объединить.
Ответ 6
Пожалуйста, помогите мне переписать код следующего. Я хочу переместить все файлы из папкиOne в свою собственную подпапку под названием "Архив" и папку "В" в свою подпапку "Архив" и т.д. У меня есть список путей, которые необходимо объединить:
import os, shutil
foldersList = ["folderOne", "folderTwo", "folderThree", "folderFour"]
basePath = "C:\\Solomon\\Project"
trgtPath = "Archive"
for eachFolder in foldersList:
path = os.path.join(basePath, eachFolder)
for r,d,f in os.walk(path):
src = os.path.join(path, f)
dst = os.path.join(path, trgtPath)
shutil.move(src, dst)
приведенный выше код не работает и каждый раз генерирует разные сообщения об ошибке. Помощь Pls.