potrafię
>>> os.path.join("c:/","home","foo","bar","some.txt")
'c:/home\\foo\\bar\\some.txt'
Ale kiedy robię
>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(s)
['c:/', 'home', 'foo', 'bar', 'some.txt']
Czego tu brakuje?
Odpowiedzi:
Problem w tym, os.path.joinże nie przyjmuje się listargumentu, muszą to być oddzielne argumenty.
Tutaj *do gry wkracza operator `` splat '' ...
potrafię
>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'
Zakładając, że joinnie został zaprojektowany w ten sposób (a tak jest, jak wskazała ATOzTOA) i wymagał tylko dwóch parametrów, nadal można było korzystać z wbudowanego reduce:
>>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt'
Takie same dane wyjściowe jak:
>>> os.path.join(*["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt'
Tylko dla kompletności i ze względów edukacyjnych (oraz w innych sytuacjach, w których *nie działa).
Wskazówka dla Pythona 3
reducezostał przeniesiony do functoolsmodułu.
reducezostał przeniesiony do functoolsmodułu na wypadek, gdyby ktoś inny szukał go tak jak ja.
reducedo modułu jest instrukcją.
from functools import reduce
Natknąłem się na sytuację, w której lista mogła być pusta. W tym wypadku:
os.path.join('', *the_list_with_path_components)
Zwróć uwagę na pierwszy argument, który nie zmieni wyniku.
To tylko metoda. Niczego nie brakuje. W oficjalnej dokumentacji wynika, że można użyć listy rozpakowywania zasilać kilka ścieżek:
s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)
Zwróć uwagę na *sintead of just sin os.path.join(*s). Użycie gwiazdki spowoduje rozpakowanie listy, co oznacza, że każdy argument listy zostanie przekazany funkcji jako oddzielny argument.
Można to również potraktować jako prostą operację redukcji mapy, jeśli chcesz spojrzeć na to z perspektywy programowania funkcjonalnego.
import os
folders = [("home",".vim"),("home","zathura")]
[reduce(lambda x,y: os.path.join(x,y), each, "") for each in folders]
reducejest wbudowany w Python 2.x. W Pythonie 3.x został przeniesiony do itertoolsJednak zaakceptowana odpowiedź jest lepsza.
Odpowiedź na to pytanie znajduje się poniżej, ale odpowiadam, jeśli masz listę elementów, które należy połączyć.