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ę list
argumentu, 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 join
nie 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
reduce
został przeniesiony do functools
modułu.
reduce
został przeniesiony do functools
modułu na wypadek, gdyby ktoś inny szukał go tak jak ja.
reduce
do 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 *s
intead of just s
in 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]
reduce
jest wbudowany w Python 2.x. W Pythonie 3.x został przeniesiony do itertools
Jednak 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ć.