【问题标题】:pathlib get base path, given the absolute and relative pathspathlib 获取基本路径,给定绝对路径和相对路径
【发布时间】:2021-08-15 00:14:08
【问题描述】:

我有:

  • A = Path('/a/b/.../m/n/.../z.txt')
  • B = Path('n/.../z.txt')

我想要:

  • C = Path('/a/b/.../m')

我们为这些路径之间的三个关系中的两个关系定义了明确、可靠的函数:

  • B == A.relative_to(C)
  • A == C / B
  • C == A.unknown_operator(B)

在给定AB 的情况下,是否有一种干净、精确的方法来计算C?或者:第三个缺失的操作是什么?还是我必须求助于字符串操作?

【问题讨论】:

    标签: python relative-path absolute-path pathlib


    【解决方案1】:

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

    A = Path('/a/b/.../m/n/.../z.txt')
    B = Path('n/.../z.txt')
    C = Path(A.as_posix().removesuffix(B.as_posix()))
    print(C)  # /a/b/.../m
    

    或从A 的末尾删除部分直到A == C/B

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

    【讨论】:

    • 这两个都比我想象的要好。你能想出这个操作的名字吗?
    • @bukzor 一个名字有什么用? “查找前缀”
    • 当 B 不是 A 的后缀时,你的第二个版本将进入无限循环。
    • 现在修复它不再进入无限循环,只是悄悄地给出不正确的答案。
    • 可以提前检查B 是否在AA in B.parents 之下。或者要特别检查B 是否是从A 开始的相对路径,请检查B.is_relative_to(A)
    【解决方案2】:

    你可以使用pathlib.Pathparents字段:

    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
    

    【讨论】:

    • 当B不是A的后缀时,这会悄悄给出一个无意义的答案。这并不理想。
    • 确实,从这个意义上说并不理想 - 因此可以稍后使用 result.joinpath(B) == A 之类的内容进行检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2010-09-15
    • 2018-09-30
    • 1970-01-01
    • 2022-06-10
    • 2013-07-14
    相关资源
    最近更新 更多