将Windows相对路径转换为POSIX相对路径,以便我可以连接POSIX绝对路径和Windows相对路径。

3
我需要一个跨平台的解决方案。在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。不过,我不认为仅仅用斜杠替换每个反斜杠是最佳实践-难道是吗?我找不到提供这种转换的函数。"最初的回答"
2个回答

3

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

1
由于我正在使用Windows,所有路径都会转换为Windows风格的路径,以\作为分隔符。在POSIX系统上,应该将其转换为/分隔符。 - abdusco
Python 不允许我在 Windows 上进行实例化,它只允许实例化 WindowsPath。 - abdusco
我真的没有尝试过。如果可以的话,就使用它吧。请记住,您可以使用“/”运算符连接路径,不必使用“joinpath()”方法。 - abdusco

2

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

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

以下是针对上述问题的解决方案:

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

由于最终路径应为 POSIX 路径,因此使用 pathlib.PurePosixPath 来处理 abspathpathlib.PurePath 可在 Windows 和 Linux 上使用:

pathlib.PurePath - 一个通用类,表示系统的路径风格(实例化时会创建一个 PurePosixPathPureWindowsPath)。

在 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路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接