Python 这是os.path.join()的预期行为吗
示例1,其中路径2以“/”结果开头,指向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文件路径:一个命令就可以完成所有工作。但是现在,如果
/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'