将 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 路径。
我正在寻找独立于平台的解决方案。一切都在 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 aPurePosixPath
or aPureWindowsPath
)
对 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 路径。