できます
>>> 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("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
別の引数でなければならないことです。
ここ*
で、「splat」演算子の出番です...
できます
>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'
( ATOzTOAjoin
が指摘したように)そのように設計されておらず、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
モジュールに移動されました。
リストが空である可能性がある状況に遭遇しました。その場合:
os.path.join('', *the_list_with_path_components)
結果を変更しない最初の引数に注意してください。
あくまでも方法です。あなたは何も見逃していません。公式ドキュメントには、リストのアンパックを使用して複数のパスを指定できることが示されています。
s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)
*s
just s
inの代わりに注意してくださいos.path.join(*s)
。アスタリスクを使用すると、リストのアンパックがトリガーされます。これは、各リスト引数が個別の引数として関数に提供されることを意味します。
関数型プログラミングの観点から考えたい場合、これは単純な map reduce 操作と考えることができます。
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
、受け入れられた答えの方が優れています。
これは以下で回答されていますが、参加する必要があるアイテムのリストがある場合は回答しています.