126

できます

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

ここで何が欠けていますか?

4

5 に答える 5

232

問題は、引数os.path.joinをとらず、list別の引数でなければならないことです。

ここ*で、「splat」演算子の出番です...

できます

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'
于 2013-02-12T06:40:15.950 に答える
30

( 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のヒント

reducefunctoolsモジュールに移動されました。

于 2013-02-12T10:39:05.550 に答える
16

リストが空である可能性がある状況に遭遇しました。その場合:

os.path.join('', *the_list_with_path_components)

結果を変更しない最初の引数に注意してください。

于 2014-04-17T16:43:56.597 に答える
10

あくまでも方法です。あなたは何も見逃していません。公式ドキュメントには、リストのアンパックを使用して複数のパスを指定できることが示されています。

s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)

*sjust sinの代わりに注意してくださいos.path.join(*s)。アスタリスクを使用すると、リストのアンパックがトリガーされます。これは、各リスト引数が個別の引数として関数に提供されることを意味します。

于 2013-02-12T06:44:39.467 に答える
2

関数型プログラミングの観点から考えたい場合、これは単純な map reduce 操作と考えることができます。

import os
folders = [("home",".vim"),("home","zathura")]
[reduce(lambda x,y: os.path.join(x,y), each, "") for each in folders]

reducePython 2.x に組み込まれています。Python 3.x では、に移動されましたがitertools、受け入れられた答えの方が優れています。

これは以下で回答されていますが、参加する必要があるアイテムのリストがある場合は回答しています.

于 2015-07-06T10:21:31.827 に答える