将Windows相对路径转换为POSIX相对路径,以便我可以加入POSIX绝对路径和Windows相对路径

时间:2019-07-03 15:56:55

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

我正在寻找与平台无关的解决方案。一切都可以在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可能是有意义的,因此我可以使用{ {1}}之后?

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

2 个答案:

答案 0 :(得分:2)

尝试使用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 :(得分:0)

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