リスト上のPythonos.path.join()


97

できます

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

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

回答:


197

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

ここ*で、「スプラット」演算子が役立ちます。

できます

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

10
スプラットのためのいくつかのより多くのコンテキスト:docs.python.org/2/tutorial/...
A.Wan

3
これを使用して、フルパスの最後の部分を削除しようとしたことに注意してください。で最初のスラッシュが欠落していたため、(Macでは)エラーが発生しました/Users/...。それを解決するために、誰かが同じ問題に直面した場合に備えて、先頭のスラッシュを手動で追加しました...
J0ANMM 2016年

23

仮定すると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のヒント

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


2
Python 3では、他の誰かが私と同じようにそれを探していた場合reducefunctools備えて、モジュールに移動されました。
Adam Badura

ヒントをありがとう、私は私の答えを調整します。
Thorsten Kranz

3
Pythonがそれを受け入れて開放するのではなく、機能的なスタイルからますます離れていくのは残念です。reduceモジュールに移動することはステートメントです。
SHernandez 2015

2.7でも1つできますfrom functools import reduce
duhaime 2018

14

私はリストが空であるかもしれない状況に出くわしました。その場合:

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

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


8

それはただの方法です。あなたは何も見逃していません。公式ドキュメントを使用すると、複数のパスを供給するために開梱リストを使用できることを示しています。

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

注意*sだけのinteadsでをos.path.join(*s)。アスタリスクを使用すると、リストの解凍がトリガーされます。これは、各リスト引数が個別の引数として関数に提供されることを意味します。


リンクをもう一度よく調べてください;
Thorsten Kranz

@Greg SOでは、リンクを貼り付けるだけでなく、関連する部分を回答にコピーすることをお勧めします。したがって、おそらく反対票
SHernandez 2015

2

関数型プログラミングの観点から考えたい場合、これは単純なマップリデュース操作と考えることもできます。

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.