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



我正在寻找独立于平台的解决方案。一切都在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

但是,我不认为简单地用斜线代替每个后卫是最好的做法 - 还是?我找不到任何提供这种转换的功能。

尝试使用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'pathtorel'
    print(BASE_DIR)
    print(rel_path)
    print(BASE_DIR / rel_path)

输出:

pathtobase
pathtorel
pathtobasepathtorel

而不是使用取决于平台的 os,或者只能与Posix路径一起使用的posixpath,Python的pathlib模块似乎是一个不错的选择:

此模块提供代表具有适用于不同操作系统的语义的文件系统路径的类

以上问题是该示例的解决方案:

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-代表系统路径风味的通用类(实例化其创建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路径。

相关内容

  • 没有找到相关文章

最新更新