如何/在哪里使用os.path.sep?

时间:2015-09-07 04:34:15

标签: python os.path

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在哪里有用?为什么它会截断路径?

5 个答案:

答案 0 :(得分:5)

  

os.path.sep有用吗?

我怀疑它的存在主要是因为模块中无论如何都需要这样的变量(以避免硬编码),如果它在那里,也可以记录下来。它的文档说它是"occasionally useful"

  

为什么它会截断路径?

来自docs for os.path.join()

  

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

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

答案 1 :(得分: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'From the docs

  

如果组件是绝对路径,则抛出所有先前的组件   离开并从绝对路径组件继续加入。

答案 2 :(得分:0)

正如os.path.join -

的文档字符串中所正确的那样
  

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

同样在docs中给出 -

  

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

     

智能地加入一个或多个路径组件。返回值是路径和*路径的任何成员的串联,在除了最后一个之外的每个非空部分之后只有一个目录分隔符(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."

答案 3 :(得分: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的部分,并从{{1}中的下一个元素重新开始}}

答案 4 :(得分:0)

  

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

直接从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返回操作系统用来分隔路径名组件的字符。 但再次引用docs

  

请注意,知道这不足以解析或连接路径名 - 使用os.path.split()和os.path.join() - 但它偶尔会有用。