将 Windows 相对路径转换为 ​​POSIX 相对路径,这样我就可以加入 POSIX 绝对路径和 Windows 相对路径

Convert Windows relative path to POSIX relative path so I can join POSIX absolute path and Windows relative path

我正在寻找独立于平台的解决方案。一切都在 Linux 上工作,因为 os.walk 已经 returns 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

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

尝试使用 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

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

This module offers classes representing filesystem paths with semantics appropriate for different operating systems

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

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

pathlib.PurePosixPath 用于 abspath,因为最终路径应该是 POSIX 路径,而 pathlib.PurePath 适用于 Windows 和 Linux:

pathlib.PurePath - A generic class that represents the system’s path flavour (instantiating it creates either a PurePosixPath or a PureWindowsPath)

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

>>> import platform
>>> platform.system()
'Linux'
>>> example("/x/y/z", "a/b/c")
'/x/y/z/a/b/c'

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

>>> import platform
>>> platform.system()
'Windows'
>>> example("/x/y/z", "a\b\c")
'/x/y/z/a/b/c'

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