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的项目列表,请回答。

Interesting Posts