最初のセクションでは OP の問題を解決しますが、私のように、共通のルートに関連するソリューションが本当に必要な場合は、2 番目のセクションでそれを解決します。3 番目のセクションでは、私が最初にどのようにアプローチしたかを説明します。
相対パス
最近、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")
共通パス
私の疑いは、あなたが本当に共通のルートに関連するパスを見ているということです。その場合は、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`
ではなく、JF 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)))])