pathlib
次のようなモジュールを使用してパス オブジェクトを作成します。
p = pathlib.Path('file.txt')
オブジェクトp
はファイルシステム内の何らかのファイルを指します。たとえば、次のように実行できますp.read_text()
。
p
文字列内のオブジェクトの絶対パスを取得するにはどうすればよいですか?
たとえば、os.path.abspath(p)
絶対パスを取得するために を使用できるようですが、を の代わりに使用する必要があるとos.path
想定しているため、 メソッドを使用するのは面倒です。pathlib
os.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()
のみ発生します。FileNotFoundError
strict
# might raise FileNotFoundError
p = p.resolve(strict=True)
ただし、 を使用すると、strict
引数を受け入れない 3.6 より前のバージョンの Python とのコードの互換性がなくなるので注意してくださいstrict
。