pathlib.Path オブジェクトの絶対パスを取得するにはどうすればいいですか? 質問する

pathlib.Path オブジェクトの絶対パスを取得するにはどうすればいいですか? 質問する

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

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

オブジェクトpはファイルシステム内の何らかのファイルを指します。たとえば、次のように実行できますp.read_text()

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

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

ベストアンサー1

使用resolve()

使用するだけPath.resolve()このような:

p = p.resolve()

これにより、パスが絶対パスになり、すべての相対部分が絶対部分に置き換えられ、すべてのシンボリック リンクが物理パスに置き換えられます。大文字と小文字を区別しないファイル システムでは、大文字と小文字も正規化されます (file.TXTは になりますfile.txt)。

absolute()Python 3.11より前は避けてください

代替方法はabsolute()Python 3.11より前では文書化もテストもされていませんでした(バグレポート@Jim Fasarakis Hilliard によって作成されました。

修正が統合されました2022年1月

違い

resolveとの違いは、 はパスのシンボリックリンク (symlink) 部分を置き換えず、 を発生させないことabsoluteです。大文字と小文字の変更も行いません。absolute()FileNotFoundError

回避したい場合resolve()(例: シンボリックリンク、大文字と小文字、相対部分を保持したい場合) は、Python <3.11 で代わりにこれを使用します。

p = Path.cwd() / "file.txt"

これは、指定するパスが絶対パスであっても機能します。その場合、cwd(現在の作業ディレクトリ) は無視されます。

Windows 上の存在しないファイルに注意してください

ファイルが存在しない場合は、Windows上のPython 3.6から3.9では、resolve()現在の作業ディレクトリを先頭に追加しません。問題 38671Python 3.10 で修正されました。

FileNotFoundErrorに注意してください

Pythonバージョン3.6より前のバージョンでは、resolve() するFileNotFoundErrorパスがディスク上に存在しない場合は例外が発生します。

したがって、これに何らかのリスクがある場合は、事前に確認するかp.exists()、エラーを試行/キャッチしてください。

# check beforehand
if p.exists():
    p = p.resolve()

# or except afterward
try:
    p = p.resolve()
except FileNotFoundError:
    # deal with the missing file here
    pass

そもそもディスク上にないパスを扱っていて、Python 3.6 以降を使用していない場合は、 に戻すのが最善ですos.path.abspath(str(p))

3.6 以降では、引数を使用する場合にresolve()のみ発生します。FileNotFoundErrorstrict

# might raise FileNotFoundError
p = p.resolve(strict=True)

ただし、 を使用すると、strict引数を受け入れない 3.6 より前のバージョンの Python とのコードの互換性がなくなるので注意してくださいstrict

おすすめ記事