Python 这是os.path.join()的预期行为吗

Python 这是os.path.join()的预期行为吗,python,Python,示例1,其中路径2以“/”结果开头,指向/dir2/dir3/(缺少路径1) 示例2,其中路径2未以“/”结果开头,以正确的/Volumes/disk1/dir2/dir3/: path1='/Volumes/disk1/' path2='dir2/dir3/' print os.path.join(path1,path2) 问:我认为os.path.join()的目的是让我们避免额外的繁琐工作,即验证它是mac、windows还是linux文件路径:一个命令就可以完成所有工作。但是现在,如果

示例1,其中路径2以“/”结果开头,指向
/dir2/dir3/
(缺少路径1)

示例2,其中路径2未以“/”结果开头,以正确的
/Volumes/disk1/dir2/dir3/

path1='/Volumes/disk1/'
path2='dir2/dir3/'
print os.path.join(path1,path2)
问:我认为os.path.join()的目的是让我们避免额外的繁琐工作,即验证它是mac、windows还是linux文件路径:一个命令就可以完成所有工作。但是现在,如果我不得不观察路径2是否以“/”(或“\”)开头,它会毁掉我所有的希望,并带来大量额外的代码。。。解决办法是什么?我不想做这种丑事:

if path2 and path2.replace('\\','/')[1:] and path2.replace('\\','/').startswith('/'):
    path2=path2[1:]

直接形成文件

智能地连接一个或多个路径组件。如果任何组件是绝对路径,则会丢弃所有以前的组件(在Windows上,包括以前的驱动器号,如果有),并继续加入

您之所以看到自己的行为,是因为您正在向它传递一个绝对路径(一个以“
”/”开头的路径)。您的程序需要能够处理两者之间的差异,如果它是生成路径的对象,请确保它可能在您需要时创建绝对路径,在您需要时创建相对路径

解释为什么这是有用的

考虑以下几点。我有一个命令行界面,要求用户指定文件输出的路径。在我的文档中,我说了以下几点:

path: Path to an output file. If relative, will be placed inside ~/Documents.
现在在我的代码中,我需要做的就是:

out_path = os.path.join('~','Documents', path)

现在,
out\u path
将始终包含正确的路径。如果用户指定
volume\u 1/output.txt
,则文件将以
~/Documents/volume\u 1/output.text
结尾。如果他们指定了
/mnt/volume\u 1/output.text
,它将在
/mnt/volume\u 1/output.text
中结束,因为绝对路径覆盖了我们默认提供的相对部分。

为了工作而不必检查分隔符,您必须在没有分隔符的情况下启动,或者在传递到
os.path.join()之前将其完全删除。在下面的代码中,我展示了3种方法,您可以这样做(玩)

个人目录 拆分路径,然后合并 Custum连接函数 使用上述代码,您可以编写一个自定义的
join()
,它可以用于单路径字符串或多路径字符串:

def join(*paths):
    import os
    return os.path.join(*[part for path in paths for part in path.split(os.sep)])

path1 = '/Volumes/disk1/'
path2 = '/dir2/dir3/'

print join(path1, path2)

输出:

'Volumes/disk1/dir2/dir3'

换句话说,我必须注意第二个、第三个等参数都是“相对”路径(不是以“/”开头)。我的意思是,你不应该“注意”任何东西。如果您的部分代码给定了一个绝对路径,它应该假定它得到了一个绝对路径。换句话说,它应该做
join
所做的事情。如果您是生成路径类型的人,则由您来生成正确的路径类型。如果用户是提供它们的人,你应该假设如果他们给你一个绝对路径,那就是他们的意思,如果不是,那就是用户错误。我希望
os.path.join()
在智能地连接一个或多个路径组件时更“智能”。令人沮丧的是,他们在文档中提到“聪明”。至少是误导,太棒了!谢谢分享!我从未见过在作用域(*())内使用start
*
符号。除了乘法之外,它在Python中还有什么用途?
os.path.join()
需要用逗号分隔的参数,而不是数组。*运算符将数组转换为逗号分隔的值。换句话说,
join(*['dir1','dir2','dir3'])=join('dir1','dir2','dir3')
path1 = '/Volumes/disk1/'
path2 = '/dir2/dir3/'

import os
# this will convert to the same as above:
# i.e., os.path.join('Volumes', 'disk1', 'dir2', 'dir3')
print os.path.join(*(path1.split(os.sep) + path2.split(os.sep)))
def join(*paths):
    import os
    return os.path.join(*[part for path in paths for part in path.split(os.sep)])

path1 = '/Volumes/disk1/'
path2 = '/dir2/dir3/'

print join(path1, path2)
'Volumes/disk1/dir2/dir3'