gpt4 book ai didi

python - 对同级目录使用 pathlib 的 relative_to

转载 作者:太空狗 更新时间:2023-10-29 17:19:09 24 4
gpt4 key购买 nike

python 库 pathlib提供 Path.relative_to .如果一条路径是另一条路径的子路径,则此函数可以正常工作,如下所示:

from pathlib import Path
foo = Path("C:\\foo")
bar = Path("C:\\foo\\bar")
bar.relative_to(foo)

> WindowsPath('bar')

但是,如果两条路径在同一级别relative_to 将不起作用。

baz = Path("C:\\baz")
foo.relative_to(baz)

> ValueError: 'C:\\foo' does not start with 'C:\\baz'

我希望结果是

WindowsPath("..\\baz")

函数os.path.relpath正确执行此操作:

import os
foo = "C:\\foo"
bar = "C:\\bar"
os.path.relpath(foo, bar)

> '..\\foo'

有没有办法使用pathlib.Path实现os.path.relpath的功能?

最佳答案

第一部分解决了 OP 的问题,但如果像我一样,他真的想要相对于公共(public)根的解决方案,那么第二部分会为他解决。第三部分描述了我最初是如何接近它的,并为了兴趣而保留。

相对路径

最近,与 Python 3.4-6 一样,os.path 模块已扩展为接受 pathlib.Path 对象。然而,在以下情况下,它不会返回 Path 对象,并且会强制包装结果。

foo = Path("C:\\foo")
baz = Path("C:\\baz")
Path(os.path.relpath(foo, baz))

> Path("..\\foo")

公共(public)路径

我怀疑您实际上是在寻找相对于公共(public)根的路径。如果是以下情况,来自 EOL , 更有用

Path(os.path.commonpath([foo, baz]))

> Path('c:/root')

通用前缀

在我使用 os.path.commonpath 之前,我使用了 os.path.comonprefix

foo = Path("C:\\foo")
baz = Path("C:\\baz")
baz.relative_to(os.path.commonprefix([baz,foo]))

> Path('baz')

但请注意,您不应该在这种情况下使用它(参见 commonprefix : Yes, that old chestnut)

foo = Path("C:\\route66\\foo")
baz = Path("C:\\route44\\baz")
baz.relative_to(os.path.commonprefix([baz,foo]))

> ...
> ValueError : `c:\\route44\baz` does not start with `C:\\route`

而是下一个来自 J. F. Sebastian 的.

Path(*os.path.commonprefix([foo.parts, baz.parts]))

> Path('c:/root')

...或者如果您觉得冗长...

from itertools import takewhile
Path(*[set(i).pop() for i in (takewhile(lambda x : x[0]==x[1], zip(foo.parts, baz.parts)))])

关于python - 对同级目录使用 pathlib 的 relative_to,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38083555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com