我正在学习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'
按预期工作。
答案 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
,您将抛出第一个参数。使用当前目录可以解决很多问题。