如何检查两个Python pathlib.Path对象是否具有相同的父级目录?

3
使用共享相同父路径的两个 Path 对象,如何进行比较以确保它们实际上共享相同的父目录?
>>> list(Path(input).parents)
[PosixPath('/usr/src/app'), PosixPath('/usr/src'), PosixPath('/usr'), PosixPath('/')]
>>> list(Path(output).parents)
[PosixPath('/usr/src/app'), PosixPath('/usr/src'), PosixPath('/usr'), PosixPath('/')]
>>> Path(input).parents == Path(output).parents
False

# huh?

尽管以下代码可以运行,但将其转换为 List 似乎有些笨拙:
>>> list(Path(input).parents) == list(Path(output).parents)
True

1
parent == parent 是可以的,顺便说一下。 - Travis Griggs
1个回答

4
Path.parents 实际上返回一个帮助对象,该对象可以启用索引访问和对路径元素(类型为 pathlib._PathParents)进行有效迭代。因此,你的比较失败,因为它正在尝试比较这两个帮助对象,而不是它们的内容。

文档在这方面有些误导:

Path.parents: 提供对路径逻辑祖先的不可变序列访问

...实际上回答问题,你有以下几个选择:

如评论中所指出的,你可以简单地比较这些父级:

Path(input).parent == Path(output).parent

这种方法在许多情况下有效,但如果路径不是相同的形式,则无法匹配 - 即当路径中出现..或存在符号链接时。

Path(...).samefile(...) 方法提供了一种避免这些问题的好方法,但请注意,使用 Path(...).parent.samefile(...) 仍可能会因为parent计算忽略 .. 而出现问题。

我发现使用 Path(...).resolve().parent.samefile(...) 的形式是避免所有这些问题的最全面的方法。

对于这个特定的问题,它看起来像:

Path(input).resolve().parent.samefile(Path(output).resolve().parent)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接