13

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

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

检查文档,这实际上是功能的设计:

os.path. 加入路径1 [路径2 [,... ]]

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

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


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

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

这按预期工作。

4

2 回答 2

15

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'
于 2012-09-26T19:38:44.233 回答
1

认为您正在编写一个实用程序cd来检查新目录,您会使用

os.path.join(currdir, newdir)

如果用户输入/b你会抛出第一个参数。这适用于使用当前目录的大量内容。

于 2012-09-26T19:41:26.103 回答