ファイル操作を行うプログラムでは、ファイルの位置を特定するために「パス(Path)」を使用します。パスには、ルートディレクトリから記述する「絶対パス」と、現在の位置(カレントディレクトリ)などを基準に記述する「相対パス」の2種類があります。
Pythonの標準ライブラリ os.path モジュールを使用すると、これらを相互に変換したり、特定の場所からの相対位置を計算したりすることが可能です。
この記事では、os.path.abspath() と os.path.relpath() の使い方について解説します。
1. 絶対パスを取得する: os.path.abspath()
「絶対パス」とは、ドライブ文字(Windows)やルート(macOS/Linux)から始まる、ファイルやディレクトリの完全な住所です。
os.path.abspath() 関数を使用すると、相対パス(ファイル名のみや . など)を、現在の作業ディレクトリ(カレントディレクトリ)を基準とした絶対パスに変換できます。
構文:
import os
絶対パス = os.path.abspath(パス)
具体的な使用例
スクリプトと同じ階層にある設定ファイルのフルパスを取得する例です。
import os
# 相対パス(現在のディレクトリにある 'settings.yaml')
relative_file_path = "settings.yaml"
# 絶対パスに変換
full_path = os.path.abspath(relative_file_path)
print(f"入力: {relative_file_path}")
print(f"絶対パス: {full_path}")
実行結果(例):
入力: settings.yaml
絶対パス: /Users/username/projects/app/settings.yaml
(Windowsの場合は C:\Users\username\projects\app\settings.yaml のようになります)
ログ出力時やデータベースへの登録時など、ファイルの場所を一意に特定して記録したい場合に非常に重要です。
2. 相対パスを取得する: os.path.relpath()
「相対パス」とは、ある地点から見た目的地の場所です。os.path.relpath() 関数を使用すると、「あるディレクトリ(start)」から「目的のパス(path)」へ移動するための経路を計算して取得できます。
構文:
相対パス = os.path.relpath(目的地パス, 開始地点パス)
※第2引数(開始地点)を省略した場合、カレントディレクトリが開始地点となります。
具体的な使用例
2つの異なるディレクトリ間の位置関係を計算する例です。例えば、Webサイトの構築において、あるHTMLファイルから画像ファイルへのリンクパスを生成する際などに役立ちます。
import os
# 目的地のパス(画像フォルダ)
target_path = "/var/www/html/assets/images/logo.png"
# 開始地点のパス(現在のページ)
start_path = "/var/www/html/pages/about"
# start_path から見た target_path への相対パスを計算
relative_route = os.path.relpath(target_path, start_path)
print(f"目的地: {target_path}")
print(f"開始点: {start_path}")
print(f"相対パス: {relative_route}")
実行結果(macOS/Linuxの場合):
目的地: /var/www/html/assets/images/logo.png
開始点: /var/www/html/pages/about
相対パス: ../../assets/images/logo.png
..(親ディレクトリ)を使って階層を遡り、正しいパスが生成されていることがわかります。
まとめ
os.path.abspath(path): 相対パスを「絶対パス」に変換します。現在の作業ディレクトリが基準となります。os.path.relpath(path, start):startからpathへの「相対パス」を計算します。
ファイルシステムの操作において、パスの形式を統一したり、動的にリンクを生成したりする際に、これらの関数は不可欠です。
