Подтвердить что ты не робот

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']

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

4b9b3361

Ответ 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.