Antworten:
Das Problem ist, os.path.joinnimmt kein listals Argument, es muss separate Argumente sein.
Hier kommt *der Splat-Operator ins Spiel ...
ich kann
>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'
/Users/.... Um es zu lösen, habe ich diesen führenden Schrägstrich manuell hinzugefügt, falls jemand vor dem gleichen Problem steht ...
Angenommen, es joinwurde nicht so entworfen (was es ist, wie ATOzTOA hervorhob), und es wurden nur zwei Parameter benötigt, könnten Sie dennoch das integrierte verwenden reduce:
>>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt'
Gleiche Ausgabe wie:
>>> os.path.join(*["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt'
Nur aus Gründen der Vollständigkeit und Bildung (und für andere Situationen, in denen *dies nicht funktioniert).
Hinweis für Python 3
reducewurde in das functoolsModul verschoben .
reducewurde in das functoolsModul verschoben, falls jemand anderes so danach suchte wie ich.
reducezu einem Modul ist eine Aussage.
from functools import reduce
Ich stolperte über die Situation, in der die Liste leer sein könnte. In diesem Fall:
os.path.join('', *the_list_with_path_components)
Beachten Sie das erste Argument, das das Ergebnis nicht verändert.
Es ist nur die Methode. Du vermisst nichts. Die offizielle Dokumentation zeigt, dass Sie das Entpacken von Listen verwenden können, um mehrere Pfade anzugeben:
s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)
Beachten Sie die *sIntead von nur sin os.path.join(*s). Die Verwendung des Sternchens löst das Entpacken der Liste aus. Dies bedeutet, dass jedes Listenargument als separates Argument an die Funktion übergeben wird.
Dies kann auch als einfache Kartenreduktionsoperation betrachtet werden, wenn Sie dies aus einer funktionalen Programmierperspektive betrachten möchten.
import os
folders = [("home",".vim"),("home","zathura")]
[reduce(lambda x,y: os.path.join(x,y), each, "") for each in folders]
reduceist in Python 2.x integriert. In Python 3.x wurde es nach verschoben. itertoolsDie akzeptierte Antwort ist jedoch besser.
Dies wurde unten beantwortet, aber beantwortet, wenn Sie eine Liste von Elementen haben, die verbunden werden müssen.