我可以
>>> 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("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
作为参数,它必须是独立的参数。
这是*
,则“图示”运营商进场...
我可以
>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'
假设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
模块。
我绊倒在列表可能是空的情况。 在这种情况下:
os.path.join('', *the_list_with_path_components)
注意第一个参数,它不会改变结果。
这只是方法。 你不会错过任何。 在官方文件显示,你可以用列表拆包提供几条路径:
s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)
注*s
这一翻译的只是s
在os.path.join(*s)
使用星号将触发列表中,这意味着每个列表参数将被提供给函数作为单独的参数的解包。
这也可以看作是一个简单的地图降低运行,如果你想从一个功能编程的角度去想它。
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
但是接受的答案是更好的。
这已经低于回答,但如果你有一个需要被连接的项目列表回答。