清单上的Python os.path.join()


97

我可以

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

我在这里想念什么?

Answers:


197

问题是,os.path.join不接受listas参数,它必须是单独的参数。

在这里*,“ splat”运算符开始起作用...

我可以

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

10
有关splat的更多信息:docs.python.org/2/tutorial/…– A.Wan 2014
6

3
请注意,我尝试使用它来删除完整路径的最后一部分。由于缺少的第一个斜杠,因此导致了错误(在Mac中)/Users/...。为了解决这个问题,我添加了手动斜杠,以防有人
遇到

23

假设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
在Python 3reducefunctools,如果有人像我一样正在寻找它,则将其移至模块。
亚当·巴杜拉

谢谢您的提示,我将调整答案。
Thorsten Kranz 2013年

3
可惜的是,python越来越多地从功能样式中走出来,而不是拥抱并开放。转移reduce到模块是一个声明。
谢尔南德兹(Sernandez)

即使是2.7,也可以from functools import reduce
duhaime '18

14

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

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

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


8

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

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

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


最好再检查一次您的链接;-)
Thorsten Kranz

@Greg因此,最好将相关部分复制到答案中,而不仅仅是粘贴链接,因此也可以粘贴
否决票

2

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

下面已经回答了这个问题,但是如果您有需要加入的项目列表,可以回答。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.