Antworten:
Das Problem ist, os.path.join
nimmt kein list
als 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 join
wurde 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
reduce
wurde in das functools
Modul verschoben .
reduce
wurde in das functools
Modul verschoben, falls jemand anderes so danach suchte wie ich.
reduce
zu 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 *s
Intead von nur s
in 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]
reduce
ist in Python 2.x integriert. In Python 3.x wurde es nach verschoben. itertools
Die akzeptierte Antwort ist jedoch besser.
Dies wurde unten beantwortet, aber beantwortet, wenn Sie eine Liste von Elementen haben, die verbunden werden müssen.