Python 给定绝对路径和相对路径,pathlib获取基本路径

Python 给定绝对路径和相对路径,pathlib获取基本路径,python,relative-path,absolute-path,pathlib,Python,Relative Path,Absolute Path,Pathlib,我有: A=Path('/A/b/../m/n/../z.txt') B=Path('n/../z.txt') 我想: C=Path('/a/b/../m') 我们为这些路径之间的三种关系中的两种关系提供了定义良好、可靠的函数: B==A.相对于(C) A==C/B C==A.unknown\u运算符(B) 对于给定的a和B,是否有一种干净、准确的方法来计算C?或者:第三个,缺失的操作是什么?或者我必须求助于字符串操作吗?使用str.removesuffix(从py3.9开始)将路径

我有:

  • A=Path('/A/b/../m/n/../z.txt')
  • B=Path('n/../z.txt')
我想:

  • C=Path('/a/b/../m')
我们为这些路径之间的三种关系中的两种关系提供了定义良好、可靠的函数:

  • B==A.相对于(C)
  • A==C/B
  • C==A.unknown\u运算符(B)

对于给定的
a
B
,是否有一种干净、准确的方法来计算
C
?或者:第三个,缺失的操作是什么?或者我必须求助于字符串操作吗?

使用
str.removesuffix
(从py3.9开始)将路径作为字符串操作如何

或者从
A
的末尾移除部分,直到
A==C/B

C = Path(A.as_posix())
while C != Path("/") and not B == A.relative_to(C):
    C = C.parent

您可以使用
pathlib.Path的
parents
字段:

C = (A.parents[len(B.parents)-1]
       if 1 <= len(B.parents) <= len(A.parents) else None)
if C is None or A != C.joinpath(B):
    # B is not a suffix of A, proceed accordingly
C=(A.parents[len(B.parents)-1]

如果1这两个都比我想象的好。你能想出这个操作的名字吗?@bukzor一个名字为什么?“查找前缀”当B不是a的后缀时,您的第二个版本将进入无限循环。现在有了修复,它不再进入无限循环,只是静静地给出了错误的答案。您可以提前检查
B
是否在
a
下,以及
a在B.parents
中。或者专门检查
B
是否是相对路径s从
A
开始,检查
B.是相对于(A)
的。当B不是A的后缀时,这会悄悄地给出一个无意义的答案。这并不理想。事实上,从这个意义上讲,它并不理想-因此可以使用类似
结果的东西来检查它。之后,joinpath(B)=A
C = (A.parents[len(B.parents)-1]
       if 1 <= len(B.parents) <= len(A.parents) else None)
if C is None or A != C.joinpath(B):
    # B is not a suffix of A, proceed accordingly