Python os.path.join () bir listede


97

Yapabilirim

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

Ama yaptığımda

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

Burada neyi özlüyorum?

Yanıtlar:


197

Sorun şu ki, os.path.joinbir listargüman olarak kabul edilmiyor , ayrı argümanlar olması gerekiyor.

İşte burada *, 'uyarıcı' operatör devreye giriyor ...

Yapabilirim

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

10
splat için biraz daha bağlam: docs.python.org/2/tutorial/…
A.Wan

3
Tam yolun son bölümünü kaldırmak için bunu kullanmaya çalıştığımı unutmayın. İlk eğik çizgi eksik olduğundan (Mac'te) bir hatayla sonuçlandı /Users/.... Bunu çözmek için, birinin aynı problemle karşılaşması durumunda,
baştaki

23

joinBu şekilde tasarlanmadığını varsayarsak (ki bu, ATOzTOA'nın da belirttiği gibi) ve yalnızca iki parametre aldı, hala yerleşik olanı kullanabilirsiniz reduce:

>>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt'

Aynı çıktı:

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

Sadece eksiksizlik ve eğitimsel nedenlerle (ve *işe yaramayan diğer durumlar için ).

Python 3 için ipucu

reducefunctoolsmodüle taşındı .


2
Python 3'te reduce, functoolsbaşkasının benim gibi araması durumunda modüle taşındı .
Adam Badura

İpucu için teşekkürler, cevabımı ayarlayacağım.
Thorsten Kranz

3
Python'un onu kucaklamak ve açmak yerine işlevsel tarzdan giderek daha fazla uzaklaşması üzücü. Hareketli reducebir modüle uzakta bir ifadedir.
SHernandez

2.7'de bile bir kutufrom functools import reduce
duhaime

14

Listenin boş olabileceği duruma düştüm. Bu durumda:

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

Sonucu değiştirmeyecek olan ilk argümana dikkat edin.


8

Bu sadece yöntem. Hiçbir şey kaçırmıyorsun. Resmi belgeler birkaç yolları tedarik açma listeyi kullanabileceğiniz gösterir:

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

Not *ssadece Koşma siçinde os.path.join(*s). Yıldız işaretinin kullanılması listenin paketinin açılmasını tetikleyecektir, bu da her liste bağımsız değişkeninin işleve ayrı bir bağımsız değişken olarak sağlanacağı anlamına gelir.


Bağlantınıza bir kez daha baksanız iyi olur ;-)
Thorsten Kranz

@Greg SO'da ilgili kısımları cevaba kopyalamak ve sadece bir bağlantıyı yapıştırmak değil, belki de olumsuz oylar
SHernandez

2

Bu, işlevsel bir programlama perspektifinden düşünmek isterseniz basit bir harita azaltma işlemi olarak da düşünülebilir.

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

reducePython 2.x'te yerleşiktir. Python 3.x'te bu, değiştirildi itertoolsancak kabul edilen cevap daha iyi.

Bu, aşağıda yanıtlanmıştır, ancak katılması gereken öğeler listeniz varsa yanıtlanmıştır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.