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

时间:2014-06-24 00:00:58

标签: python

示例1其中path2以' /'开头结果为/dir2/dir3/(缺少路径1)

path1='/Volumes/disk1/'
path2='/dir2/dir3/'
print os.path.join(path1,path2)

示例2其中path2不以' /'开头结果为/Volumes/disk1/dir2/dir3/

path1='/Volumes/disk1/'
path2='dir2/dir3/'
print os.path.join(path1,path2)

问题:我认为os.path.join()的目的是允许我们避免额外的繁琐工作,验证它是否是mac,windows或linux文件路径:一个命令完成所有操作。但现在,如果我必须观察path2是否开始或不是以' /'开头(或者' \ n)它破坏了我的每一个希望并带来了大量的额外代码......解决方案是什么?我不想做这个丑陋的事情:

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

2 个答案:

答案 0 :(得分:1)

直接形成文档,

  

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

您正在查看自己的行为,因为您传递的是绝对路径(以'/'开头的路径)。你的程序需要能够处理两者之间的差异,如果它是生成路径的东西,请确保它可能在你想要的时候创建一个绝对路径,而当你想要它时可以创建一个相对路径想要那个。

解释为什么这很有用

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

path: Path to an output file. If relative, will be placed inside ~/Documents.

现在在我的代码中,我需要做的就是:

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

现在out_path将始终包含正确的路径。如果用户指定volume_1/output.txt,则该文件将在~/Documents/volume_1/output.text中结束。如果他们指定/mnt/volume_1/output.text,它将会在/mnt/volume_1/output.text中结束,因为绝对路径会覆盖我们提供的相对部分作为默认值。

答案 1 :(得分:1)

为了在没有检查分隔符的麻烦下工作,您必须在没有它们的情况下启动或在传递给os.path.join()之前完全删除它们。在下面的代码中,我展示了3种方法(Live Ideone Example可以使用)。

个人目录

import os
print os.path.join('Volumes', 'disk1', '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)))

Custum Join Function

使用上面的代码,您可以编写适用于单路径或多路径字符串的自定义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'