Python 如何/在何处使用os.path.sep?

Python 如何/在何处使用os.path.sep?,python,os.path,Python,Os.path,os.path.sep是操作系统用来分隔路径名组件的字符 但是当在os.path.join()中使用os.path.sep时,为什么它会截断路径 例如: 而不是'home/python',os.path.join返回'/python': >>> import os >>> os.path.join('home', os.path.sep, 'python') '/python' 我知道会隐式插入目录分隔符 os.path.sep在哪里有用?为什么它会截断路径

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

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

例如:

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

>>> import os
>>> os.path.join('home', os.path.sep, 'python')
'/python'
我知道会隐式插入目录分隔符

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

os.path.sep在哪里有用

我怀疑它的存在主要是因为模块中无论如何都需要这样一个变量(以避免硬编码),如果它存在,那么最好将其记录下来。它的文件说它是

为什么它会截断路径

从:

如果组件是绝对路径,则会丢弃所有以前的组件,并从绝对路径组件继续连接


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

os.path.join()调用中删除
os.path.sep
。在内部使用
os.path.sep

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

如果某个组件是绝对路径,则会抛出以前的所有组件 “远离”和“连接”从绝对路径组件继续


os.path.join的docstring中正确给出的-

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

表中也给出了同样的内容-

os.path.join(path,*path)

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

以下是在
POSIX
机器上运行的代码片段:

# 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
中的下一个元素开始

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

直接从以下文件中引用:

如果组件是绝对路径,则会丢弃所有以前的组件,并从绝对路径组件继续连接

所以当你这样做的时候:

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.sep
os.sep
返回操作系统用于分隔路径名组件的字符。 但还是引用了《华尔街日报》的话:

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