web-dev-qa-db-ja.com

pathlib.Pathオブジェクトの絶対パスを取得する方法は?

次のようなpathlibモジュールでパスオブジェクトを作成します。

p = pathlib.Path('file.txt')

pオブジェクトは、たとえばp.read_text()を実行できるため、ファイルシステム内のいくつかのファイルを指します。

文字列でpオブジェクトの絶対パスを取得するにはどうすればよいですか?

たとえば、os.path.abspath(p)を使用して絶対パスを取得できるように見えますが、pathlibos.pathの代わりに使用する必要があるため、os.pathメソッドを使用するのは厄介です。

29
EquipDev

.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継承オブジェクトへの文書化されていない追加。

これを文書化するための問題を作成しました

Resolve()を使用します

Path.resolve() を次のように使用します。

p = p.resolve()

これにより、パスが絶対になり、すべての相対部分が絶対部分に置き換えられます。

Absolute()を避ける

使用しないでくださいabsolute()(ほぼ同じです)文書化されておらず、テストされておらず、削除の検討もされていないためです。 (@ -Jim Fasarakis Hilliardによって作成された バグレポート の説明を参照してください)。

違いは、absolute()はパスの相対部分を置き換えず、FileNotFoundErrorを発生させないことです。

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バージョンと互換性がなくなります。これらの引数は引数を受け入れないためです。

63
florisla

単にパスが必要で、ファイルが存在するかどうかを確認したくない場合は、次のようにします。

str(p)

Operations セクションのドキュメントとして。

1
Veech