puedo hacer
>>> os.path.join("c:/","home","foo","bar","some.txt")
'c:/home\\foo\\bar\\some.txt'
Pero cuando lo hago
>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(s)
['c:/', 'home', 'foo', 'bar', 'some.txt']
What am I missing here?
python
python-2.7
os.path
ATOzTOA
fuente
fuente
/Users/...
. To solve it, I added that leading slash manually, in case somebody faces the same problem...Assuming
join
wasn't designed that way (which it is, as ATOzTOA pointed out), and it only took two parameters, you could still use the built-inreduce
:>>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"]) 'c:/home\\foo\\bar\\some.txt'
Same output like:
>>> os.path.join(*["c:/","home","foo","bar","some.txt"]) 'c:/home\\foo\\bar\\some.txt'
Just for completeness and educational reasons (and for other situations where
*
doesn't work).Hint for Python 3
reduce
was moved to thefunctools
module.fuente
reduce
was moved tofunctools
module in case anyone else was looking for it as I was.reduce
away to a module is a statement.from functools import reduce
I stumbled over the situation where the list might be empty. In that case:
os.path.join('', *the_list_with_path_components)
Note the first argument, which will not alter the result.
fuente
It's just the method. You're not missing anything. The official documentation shows that you can use list unpacking to supply several paths:
s = "c:/,home,foo,bar,some.txt".split(",") os.path.join(*s)
Note the
*s
intead of justs
inos.path.join(*s)
. Using the asterisk will trigger the unpacking of the list, which means that each list argument will be supplied to the function as a separate argument.fuente
This can be also thought of as a simple map reduce operation if you would like to think of it from a functional programming perspective.
import os folders = [("home",".vim"),("home","zathura")] [reduce(lambda x,y: os.path.join(x,y), each, "") for each in folders]
reduce
is builtin in Python 2.x. In Python 3.x it has been moved toitertools
However the accepted the answer is better.This has been answered below but answering if you have a list of items that needs to be joined.
fuente