问题:清单上的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']
我在这里想念什么?
回答 0
问题是,os.path.join
不接受list
as参数,它必须是单独的参数。
在这里*
,“ splat”运算符开始起作用…
我可以
>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'
回答 1
假设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提示
reduce
已移至functools
模块。
回答 2
我偶然发现列表可能为空的情况。在这种情况下:
os.path.join('', *the_list_with_path_components)
注意第一个参数,它不会改变结果。
回答 3
这只是方法。您什么都不会错过。在官方文件显示,你可以用列表拆包提供几条路径:
s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)
注意in中的*s
intead 。使用星号将触发列表的解压缩,这意味着每个列表参数将作为单独的参数提供给函数。s
os.path.join(*s)
回答 4
如果您希望从功能编程的角度考虑它,也可以将其视为简单的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
但是,公认的答案更好。
下面已经回答了这个问题,但是如果您有需要加入的项目列表,可以回答。