できます
>>> 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']
ここで何が欠けていますか?
回答:
問題は、引数をos.path.join
とらないで、list
別々の引数でなければならないということです。
ここ*
で、「スプラット」演算子が役立ちます。
できます
>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'
/Users/...
。それを解決するために、誰かが同じ問題に直面した場合に備えて、先頭のスラッシュを手動で追加しました...
仮定するとjoin
(ATOzTOAが指摘したように、それは、ある)そのように設計された、そしてそれは2つのパラメータのみを取っていなかった、あなたはまだ使用できるビルトイン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'
完全性と教育上の理由だけで(そして*
うまくいかない他の状況のために)。
Python3のヒント
reduce
functools
モジュールに移動されました。
reduce
にfunctools
備えて、モジュールに移動されました。
reduce
モジュールに移動することはステートメントです。
from functools import reduce
私はリストが空であるかもしれない状況に出くわしました。その場合:
os.path.join('', *the_list_with_path_components)
結果を変更しない最初の引数に注意してください。
それはただの方法です。あなたは何も見逃していません。公式ドキュメントを使用すると、複数のパスを供給するために開梱リストを使用できることを示しています。
s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)
注意*s
だけのinteads
でを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
Python2.xに組み込まれています。Python 3.xでは、に移動されましたがitertools
、受け入れられた答えの方が優れています。
これは以下で回答されていますが、参加する必要のあるアイテムのリストがある場合は回答します。