次のようなpathlib
モジュールでパスオブジェクトを作成します。
p = pathlib.Path('file.txt')
p
オブジェクトは、たとえばp.read_text()
を実行できるため、ファイルシステム内のいくつかのファイルを指します。
文字列でp
オブジェクトの絶対パスを取得するにはどうすればよいですか?
たとえば、os.path.abspath(p)
を使用して絶対パスを取得できるように見えますが、pathlib
をos.path
の代わりに使用する必要があるため、os.path
メソッドを使用するのは厄介です。
.absolute
メソッドを探していますが、私の理解が正しければ、誰がドキュメントを述べています:
>>> print(p.absolute.__doc__)
Return an absolute version of this path. This function works
even if the path doesn't point to anything.
No normalization is done, i.e. all '.' and '..' will be kept along.
Use resolve() to get the canonical path to a file.
私のシステムにテストファイルがあると、次の結果が返されます。
>>> p = pathlib.Path('testfile')
>>> p.absolute()
PosixPath('/home/jim/testfile')
この方法 は新しいようです。 それでも、Path
およびPath
継承オブジェクトへの文書化されていない追加。
Path.resolve() を次のように使用します。
p = p.resolve()
これにより、パスが絶対になり、すべての相対部分が絶対部分に置き換えられます。
使用しないでくださいabsolute()
(ほぼ同じです)文書化されておらず、テストされておらず、削除の検討もされていないためです。 (@ -Jim Fasarakis Hilliardによって作成された バグレポート の説明を参照してください)。
違いは、absolute()はパスの相対部分を置き換えず、FileNotFoundError
を発生させないことです。
V3.6より前のPythonバージョンでは、resolve()
doesパスがそうでない場合はFileNotFoundError
を上げますディスク上に存在します。
そのため、リスクがある場合は、p.exists()
で事前に確認するか、エラーを試行/キャッチしてください。
# check beforehand
if p.exists():
p = p.resolve()
# or catch afterward
try:
p = p.resolve()
catch FileNotFoundError:
# deal with the missing file here
pass
そもそもディスク上にないパスを扱っており、Python 3.6+上にない場合は、os.path.abspath(str(p))
に戻すのが最善です。
3.6以降、resolve()
は、strict
引数を使用した場合にのみFileNotFoundErrorを発生させます。
# might raise FileNotFoundError
p = p.resolve(strict=True)
ただし、strict
を使用すると、3.6より前のPythonバージョンと互換性がなくなります。これらの引数は引数を受け入れないためです。