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

ATO*_*TOA 77 python python-2.7 os.path

我可以

>>> os.path.join("c:/","home","foo","bar","some.txt")
'c:/home\\foo\\bar\\some.txt'
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做的时候

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(s)
['c:/', 'home', 'foo', 'bar', 'some.txt']
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

ATO*_*TOA 151

问题是,os.path.joinlist作为参数,它必须是单独的参数.

这就是*'splat'运营商发挥作用的地方......

我可以

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

  • splat的更多上下文:https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists (8认同)
  • 请注意,我尝试使用它来删除完整路径的最后一部分.它导致[错误](http://stackoverflow.com/questions/31693272/errno-2-using-python-shutil-py-no-such-file-or-directory-for-file-destination)(在Mac),因为它缺少`/ Users/...`的第一个斜杠.为了解决这个问题,我手动添加了斜杠,以防有人遇到同样的问题...... (2认同)

Tho*_*anz 19

假设join不是那样设计的(正如ATOzTOA指出的那样),并且它只使用了两个参数,你仍然可以使用内置的reduce:

>>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt'
Run Code Online (Sandbox Code Playgroud)

相同的输出如:

>>> os.path.join(*["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt' 
Run Code Online (Sandbox Code Playgroud)

仅仅是出于完整性和教育原因(以及其他*不起作用的情况).

提示Python 3 对于Python 3,reduce已移至functools模块.

  • 遗憾的是,python越来越远离功能风格而不是拥抱它和开放.将`reduce`移到模块是一个声明. (3认同)
  • 在Python 3中,`reduce`被移动到`functools`模块,以防其他人像我一样寻找它. (2认同)

Seb*_*ach 8

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

os.path.join('', *the_list_with_path_components)
Run Code Online (Sandbox Code Playgroud)

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


Gre*_*reg 6

这只是方法。您什么都不会错过。在官方文件显示,你可以用列表拆包提供几条路径:

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

注意in中的*sintead 。使用星号将触发列表的解压缩,这意味着每个列表参数将作为单独的参数提供给函数。sos.path.join(*s)