【问题标题】:In Python, how do I specify directory separator in os.path.join() function?在 Python 中,如何在 os.path.join() 函数中指定目录分隔符?
【发布时间】:2016-12-05 10:19:58
【问题描述】:

我尝试了如下代码,试图将目录分隔符更改为正斜杠/,但仍然卡在反斜杠\。文档说该函数使用目录分隔符os.sep 连接路径,但这在我的情况下不起作用。

import os
os.sep = '/'
print(os.sep)
print(os.path.join('.', 'path'))

【问题讨论】:

  • 也许你想要'/'.join(['.', 'path']) 代替?在大多数情况下(但并非全部,所以要小心),您将获得与您的 sep 设置为您希望的相同的输出。
  • 你为什么要这样做?反斜杠对您的操作系统来说真的是错误的吗?

标签: python operating-system


【解决方案1】:

您可以查看不同操作系统的源代码。比如Mac版是:

def join(s, *p):
    path = s 
    for t in p:
        if (not s) or isabs(t):
            path = t 
            continue
        if t[:1] == ':':
            t = t[1:]
        if ':' not in path:
            path = ':' + path
        if path[-1:] != ':':
            path = path + ':' 
        path = path + t 
    return path

可以看到直接放到函数里面了。它不依赖于os.sep。每个 Python 安装都包含适用于每个操作系统的 os.path 函数。它们位于macpath.pyntpath.pyposixpath.py 下的Python 目录中。如果你查看每一个,你会注意到posixpath 模块有你想要的:

import posixpath

print(posixpath.join('.', 'path'))

【讨论】:

    【解决方案2】:

    我认为this 回答了 Python 为何使用特定分隔符的问题。

    也就是说,您可以使用 Pathlib 模块来构建您的路径并指定您想要的是 Posix 还是 Windows 路径。

    例子:

    from pathlib import PurePosixPath, PureWindowsPath
    
    print(PurePosixPath('some', 'silly', 'long', 'path'))
    >> some/silly/long/path
    
    print(PureWindowsPath('some', 'silly', 'long', 'path'))
    >> some\silly\long\path
    

    确保使用PosixPathWindowsPathpure 版本。如果您尝试在 Posix 系统上使用 WindowsPath,您将收到以下错误:

    NotImplementedError: cannot instantiate 'WindowsPath' on your system
    

    这也在docs中指定:

    如果您想在 Unix 机器上操作 Windows 路径(反之亦然)。在 Unix 上运行时不能实例化 WindowsPath,但可以实例化 PureWindowsPath

    【讨论】:

      【解决方案3】:

      您可以将os.path中的函数替换为自己的:

      import os
      path = "public\\INSTALL\\"
      print("Initial unmodified join return: '%s'" % os.path.join('.', path) )
      native_os_path_join = os.path.join
      def modified_join(*args, **kwargs):
          return native_os_path_join(*args, **kwargs).replace('\\', '/')
      os.path.join = modified_join
      print("Modified join return: '%s'" % os.path.join('.', path) )
      

      输出:

      Initial unmodified join return: '.\public\INSTALL\'
      Modified join return: './public/INSTALL/'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        • 1970-01-01
        • 2015-11-15
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 2019-06-12
        相关资源
        最近更新 更多