Python os.path.join()在列表上
我可以
>>> os.path.join("c:/","home","foo","bar","some.txt") 'c:/home\\foo\\bar\\some.txt'
但是,当我这样做
>>> s = "c:/,home,foo,bar,some.txt".split(",") >>> os.path.join(s) ['c:/', 'home', 'foo', 'bar', 'some.txt']
我在这里错过了什么?
问题是, os.path.join
不会将list
作为参数,它必须是单独的参数。
这是'splat'操作员进入的地方。
我可以
>>> s = "c:/,home,foo,bar,some.txt".split(",") >>> os.path.join(*s) 'c:/home\\foo\\bar\\some.txt'
假设join
不是这样devise的(就像ATOzTOA指出的那样),它只用了两个参数,你仍然可以使用内置的reduce
:
>>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"]) 'c:/home\\foo\\bar\\some.txt'
相同的输出如:
>>> os.path.join(*["c:/","home","foo","bar","some.txt"]) 'c:/home\\foo\\bar\\some.txt'
只是出于完整性和教育的原因(和其他情况下*
不起作用)。
提示Python 3对于Python 3, reduce
被移到了functools
模块中。
我偶然发现列表可能是空的情况。 在这种情况下:
os.path.join('', *the_list_with_path_components)
注意第一个参数,它不会改变结果。
这只是方法。 你不会错过任何东西。 官方文档显示,你可以使用列表解压来提供几个path:
s = "c:/,home,foo,bar,some.txt".split(",") os.path.join(*s)
请注意os.path.join(*s)
的*s
intead。 使用星号将触发列表的解包,这意味着每个列表参数将作为单独的参数提供给函数。
如果你想从函数式编程的angular度来思考,这也可以被认为是一个简单的map reduce操作。
import os folders = [("home",".vim"),("home","zathura")] [reduce(lambda x,y: os.path.join(x,y), each, "") for each in folders]
reduce
在Python 2.x中内置。 在Python 3.x中,它已经被转移到itertools
然而,接受的答案是更好的。
这已经在下面得到了回答,但如果您有一个需要join的项目列表,请回答。