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?
python
python-2.7
os.path
ATOzTOA
źródło
źródło
/Users/...
. Aby to rozwiązać, dodałem ręcznie ten ukośnik, na wypadek gdyby ktoś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 wbudowanegoreduce
:>>> 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 dofunctools
modułu.źródło
reduce
został przeniesiony dofunctools
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.
źródło
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 justs
inos.path.join(*s)
. Użycie gwiazdki spowoduje rozpakowanie listy, co oznacza, że każdy argument listy zostanie przekazany funkcji jako oddzielny argument.źródło
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 doitertools
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ć.
źródło