6

os.path.sep是操作系统用来分隔路径名组件的字符。

但是在os.path.sep使用的时候os.path.join(),为什么会截断路径呢?

例子:

而不是'home/python'os.path.join返回'/python'

>>> import os
>>> os.path.join('home', os.path.sep, 'python')
'/python'

我知道os.path.join()隐式插入目录分隔符。

哪里os.path.sep有用?为什么它会截断路径?

4

5 回答 5

6

os.path.sep 在哪里有用?

我怀疑它的存在主要是因为无论如何模块中都需要这样的变量(以避免硬编码),如果它在那里,它可能会被记录在案。它的文档说它“偶尔有用”

为什么它会截断路径?

文档中os.path.join()

如果组件是绝对路径,则所有先前的组件都将被丢弃,并从绝对路径组件继续连接。

并且/是 *nix 系统上的绝对路径。

于 2015-09-07T04:42:59.853 回答
0

如果您在POSIX机器上,这是运行的代码片段:

posixpath.py

# Join pathnames.
# Ignore the previous parts if a part is absolute.
# Insert a '/' unless the first part is empty or already ends in '/'.

def join(a, *p):
    """Join two or more pathname components, inserting '/' as needed.
    If any component is an absolute path, all previous path components
    will be discarded.  An empty last part will result in a path that
    ends with a separator."""
    sep = _get_sep(a)
    path = a
    try:
        if not p:
            path[:0] + sep  #23780: Ensure compatible data type even if p is null.
        for b in p:
            if b.startswith(sep):
                path = b
            elif not path or path.endswith(sep):
                path += b
            else:
                path += sep + b
    except (TypeError, AttributeError, BytesWarning):
        genericpath._check_arg_types('join', a, *p)
        raise
    return path

具体来说,这些行:

        if b.startswith(sep):
            path = b

而且,由于os.path.sep肯定是从这个字符开始的,所以每当我们遇到它时,我们都会丢弃path已经构建的变量部分,并从 中的下一个元素重新开始p

于 2015-09-07T04:51:57.490 回答
0

但是当 os.path.sep 在 os.path.join() 中使用时,为什么它会截断路径?

直接引用os.path.join的文档

如果组件是绝对路径,则所有先前的组件都将被丢弃,并从绝对路径组件继续连接。

所以当你这样做时:

os.path.join('home', os.path.sep, 'python')

os.path.sep返回'/'这是一个绝对路径,因此'home'被丢弃,你只得到'/python'输出。

从示例中也可以清楚地看出这一点:

>>> import os
>>> os.path.join('home','/python','kivy')
'/python/kivy'

os.path.sep 在哪里有用?

os.path.sepos.sep返回操作系统用来分隔路径名组件的字符。但再次引用文档

请注意,知道这一点不足以解析或连接路径名——使用 os.path.split() 和 os.path.join()——但它有时很有用。

于 2015-09-07T05:05:57.257 回答
0

挂断电话os.path.sep。内部使用。os.path.join()os.path.join()os.path.sep

在您的系统上,os.path.sep == '/'它被解释为根目录(绝对路径),因此os.path.join('home', '/', 'python')相当于os.path.join('/', 'python') == '/python'. 从文档

如果组件是绝对路径,则所有先前的组件都将被丢弃,并从绝对路径组件继续连接。

于 2015-09-07T04:44:08.670 回答
0

正如在文档字符串中正确给出的os.path.join-

加入两个或多个路径名组件,根据需要插入“/”。如果任何组件是绝对路径,则所有先前的路径组件都将被丢弃。

文档中也给出了相同的-

os.path.join(路径,*路径)

智能地加入一个或多个路径组件。返回值是 path 和 *paths 的任何成员的串联,除了最后一个部分之外的每个非空部分后面都有一个目录分隔符 (os.sep),这意味着如果最后一部分为空,结果只会以分隔符结尾. 如果组件是绝对路径,则所有先前的组件都将被丢弃,并从绝对路径组件继续连接。

当你os.path.sep单独给出时,它被认为是根目录的绝对路径 - /

请注意,这是基于 unix/linux 的 os.path ,内部是posixpath. 尽管在 windows 中可以看到相同的行为os.path.join()

例子 -

>>> import os.path
>>> os.path.join.__doc__
"Join two or more pathname components, inserting '/' as needed.\n    If any component is an absolute path, all previous path components\n    will be discarded."
于 2015-09-07T04:44:20.757 回答