列表中的Python os.path.join()

时间:2013-02-12 06:40:16

标签: python python-2.7 os.path

我能做到

>>> 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']

我在这里缺少什么?

5 个答案:

答案 0 :(得分:130)

问题是,os.path.join没有list作为参数,它必须是单独的参数。

这是*,'splat'运算符发挥作用的地方......

我能做到

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'

答案 1 :(得分:19)

假设join不是那样设计的(正如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模块。

答案 2 :(得分:8)

我偶然发现列表可能为空的情况。在那种情况下:

os.path.join('', *the_list_with_path_components)

注意第一个参数,它不会改变结果。

答案 3 :(得分:6)

这只是方法。你没有遗漏任何东西。 official documentation表示您可以使用列表解包来提供多个路径:

s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)

请注意*s中仅s的{​​{1}}个整数。使用星号将触发列表的解包,这意味着每个列表参数将作为单独的参数提供给函数。

答案 4 :(得分:0)

如果您想从功能编程角度考虑它,也可以将其视为简单的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但是接受的答案更好。

以下已对此进行了解答,但如果您有需要加入的项目列表,请回答。