【问题标题】:How/where to use os.path.sep?如何/在哪里使用 os.path.sep?
【发布时间】:2015-09-07 04:34:15
【问题描述】:

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

但是当os.path.sepos.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 有什么用处?为什么会截断路径?

【问题讨论】:

    标签: python os.path


    【解决方案1】:

    os.path.sep 在哪里有用?

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

    为什么会截断路径?

    来自docs for os.path.join()

    如果一个组件是绝对路径,所有之前的组件都被丢弃,并从绝对路径组件继续加入。

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

    【讨论】:

      【解决方案2】:

      os.path.join() 呼叫中删除os.path.sepos.path.join() 在内部使用 os.path.sep

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

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

      【讨论】:

        【解决方案3】:

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

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

        docs 中也给出了相同的 -

        os.path.join(path, *paths)

        智能地加入一个或多个路径组件。返回值是 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."
        

        【讨论】:

          【解决方案4】:

          如果您在 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 中的下一个元素重新开始。

          【讨论】:

            【解决方案5】:

            但是在 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()——但它有时很有用。

            【讨论】:

              猜你喜欢
              • 2011-10-17
              • 2018-10-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-06-24
              • 1970-01-01
              • 2014-01-18
              相关资源
              最近更新 更多