为什么os.path.join抛弃了参数?

时间:2012-09-26 19:33:47

标签: python language-design

我正在学习Python,我注意到我的一个脚本有些奇怪。做了一点测试我发现问题源于这种行为:

>>> import os
>>> os.path.join('a','b')
'a/b'
>>> os.path.join('a','/b')
'/b'

检查documentation,实际上这是函数的设计:

  

os.path。加入 path1 [ path2 [, ... ]]

     
    

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

  

我的问题不是why my script failed,而是为什么功能是这样设计的。我的意思是,至少在Unix上,a//b是指定路径的完全可接受的方式,如果不是优雅的话。为什么功能是这样设计的?有没有办法判断是否丢弃了一个或多个路径元素而不是使用os.path.isabs()测试每个路径字符串?


出于好奇,我还检查了路径组件以os.sep字符结尾的情况:

>>> os.path.join('a/','b')
'a/b'

按预期工作。

2 个答案:

答案 0 :(得分:14)

如果您向用户询问文件名,则os.path.join('a', '/b')返回/b非常有用的一种情况。

用户可以输入相对于当前目录的路径或完整路径,并且您的程序可以处理这两种情况:

os.path.join(os.getcwd(), filename)

In [54]: os.getcwd()
Out[54]: '/tmp'

In [55]: os.path.join(os.getcwd(), 'foo')
Out[55]: '/tmp/foo'

In [56]: os.path.join(os.getcwd(), '/foo/bar')
Out[56]: '/foo/bar'

答案 1 :(得分:1)

认为您正在编写像cd这样的实用程序来检查新目录,您可以使用

os.path.join(currdir, newdir)

如果用户输入/b,您将抛出第一个参数。使用当前目录可以解决很多问题。