将相对路径解析为 Python 中的另一个相对路径
resolve a relative path to another relative path in Python
我有一个相对于另一个相对路径的相对路径,我想加入它们:
rel_path1 = '../../data/a'
rel_path2 = '../../main.xml'
# pseudo function: join_rel_paths
result = join_rel_paths(rel_path1, rel_path2)
# My expectation
expected_result = '../../../main.xml'
assert result == expected_result
有没有可以实现这个的库?
- 我试过
pathlib.Path
:(Path(rel_path1) / Path(rel_path2)).resolve()
-> 它 returns 是 cwd
的绝对路径
- 我试过
urllib.parse.urljoin
:urljoin(rel_path1, rel_path2)
-> main.xml
不是我想要的
您的示例的预期结果应为 ../../main.xml
,即与 rel_path2
相同。 rel_path2
中的两个 ..
从 rel_path1
中剥离了最后两个组件,将其保留为 ../..
。然后是 main.xml
。 (但往下看如何去掉 rel_path1
的最后一个部分。)
您可以通过使用 os.path.join
后跟 os.path.normpath
:
来实现
rel_path1 = '../../data/a'
rel_path2 = '../../main.xml'
tmp = os.path.join(rel_path1, rel_path2)
result = os.path.normpath(tmp)
这为 tmp
提供了 '../../data/a/../../main.xml'
,为 result
提供了 '../../main.xml'
。
如果您想将 rel_path1
的最后一个组件视为一个文件(并忽略它),您可以使用 os.path.dirname
来实现:
rel_path1b = os.path.dirname(rel_path1)
这会将 rel_path1b
设置为 '../../data'
,然后您可以使用它代替 rel_path1
以获得 '../../../main.xml'
。
我有一个相对于另一个相对路径的相对路径,我想加入它们:
rel_path1 = '../../data/a'
rel_path2 = '../../main.xml'
# pseudo function: join_rel_paths
result = join_rel_paths(rel_path1, rel_path2)
# My expectation
expected_result = '../../../main.xml'
assert result == expected_result
有没有可以实现这个的库?
- 我试过
pathlib.Path
:(Path(rel_path1) / Path(rel_path2)).resolve()
-> 它 returns 是cwd
的绝对路径
- 我试过
urllib.parse.urljoin
:urljoin(rel_path1, rel_path2)
->main.xml
不是我想要的
您的示例的预期结果应为 ../../main.xml
,即与 rel_path2
相同。 rel_path2
中的两个 ..
从 rel_path1
中剥离了最后两个组件,将其保留为 ../..
。然后是 main.xml
。 (但往下看如何去掉 rel_path1
的最后一个部分。)
您可以通过使用 os.path.join
后跟 os.path.normpath
:
rel_path1 = '../../data/a'
rel_path2 = '../../main.xml'
tmp = os.path.join(rel_path1, rel_path2)
result = os.path.normpath(tmp)
这为 tmp
提供了 '../../data/a/../../main.xml'
,为 result
提供了 '../../main.xml'
。
如果您想将 rel_path1
的最后一个组件视为一个文件(并忽略它),您可以使用 os.path.dirname
来实现:
rel_path1b = os.path.dirname(rel_path1)
这会将 rel_path1b
设置为 '../../data'
,然后您可以使用它代替 rel_path1
以获得 '../../../main.xml'
。