【问题标题】:Convert Windows relative path to POSIX relative path so I can join POSIX absolute path and Windows relative path将 Windows 相对路径转换为 ​​POSIX 相对路径,以便我可以加入 POSIX 绝对路径和 Windows 相对路径
【发布时间】:2019-11-14 08:57:03
【问题描述】:

我正在寻找一个独立于平台的解决方案。一切都可以在 Linux 上运行,因为 os.walk 已经返回 POSIX 路径。但是,如果我在 Windows 上,我可能会得到以下两条路径:

abspath = "/x/y/z" # given path for a remote server which uses POSIX paths
relpath = "a\\b\\c" # acquired from local file system via os.walk, so it uses slash or backslash depending on the platform

此示例的连接路径的期望结果是:

'/x/y/z/a/b/c'

但是,使用posixpath.join 自然会导致:

>>> posixpath.join(abspath, relpath)
'/x/y/z/a\\b\\c'

所以当我在 Windows 上并且有一个像 a\\b\\c 这样的相对路径时,我认为首先将其转换为 POSIX 相对路径 a/b/c 可能是有意义的,所以我可以在之后使用 posixpath.join

但是,我不认为简单地用斜杠替换每个反斜杠是最佳做法 - 是吗?我找不到任何提供这种转换的函数。

【问题讨论】:

    标签: python windows path relative-path absolute-path


    【解决方案1】:

    尝试使用pathlib.Path,它消除了跨平台操作路径的棘手部分。

    https://docs.python.org/3/library/pathlib.html

    from pathlib import Path, PosixPath
    
    
    if __name__ == '__main__':
        BASE_DIR = Path('/path/to/base')
        rel_path = r'path\to\rel'
        print(BASE_DIR)
        print(rel_path)
        print(BASE_DIR / rel_path)
    

    输出:

    \path\to\base
    path\to\rel
    \path\to\base\path\to\rel
    

    【讨论】:

    • 由于我在 Windows 上,所有路径都转换为以 \ 为分隔符的 Windows 样式路径。在 POSIX 系统上,它应该转换为 / 分隔符
    • python 不允许我在 Windows 上实例化它的事实。它只允许实例化 WindowsPath。
    • 我没试过,真的。如果可行,请使用它。请记住,您可以使用 / 运算符连接路径,而不必使用 joinpath() 方法。
    【解决方案2】:

    Python 的 pathlib 模块在这里似乎是一个不错的选择,而不是使用取决于平台的 os 或仅适用于 POSIX 路径的 posixpath

    这个模块提供了代表文件系统路径的类,其语义适用于不同的操作系统

    这是上述问题示例的解决方案:

    def example(abspath, relpath):
        import pathlib
        abspath = pathlib.PurePosixPath(abspath)
        relpath = pathlib.PurePath(relpath)
        return str(abspath.joinpath(relpath))
    

    pathlib.PurePosixPath 被用于abspath,因为最终路径应该是 POSIX 路径,而pathlib.PurePath 在 Windows 和 Linux 上都可以工作:

    pathlib.PurePath - 表示系统路径风格的通用类(实例化它会创建 PurePosixPathPureWindowsPath

    Linux 上的示例调用可能如下所示:

    >>> example("/x/y/z", "a/b/c")
    '/x/y/z/a/b/c'
    

    Windows 上的示例调用可能如下所示:

    >>> example("/x/y/z", "a\\b\\c")
    '/x/y/z/a/b/c'
    

    因此它会在两个平台上生成正确的 POSIX 路径。

    【讨论】:

      猜你喜欢
      • 2016-01-07
      • 2017-08-01
      • 2011-11-07
      • 2011-05-02
      相关资源
      最近更新 更多