相対パスと絶対パスを相互に変換するには os.path.abspath() や pathlib.Path.resolve() を使う。
相対パスを絶対パスに変換する
os.path.abspath() を使うと、相対パスを絶対パスに変換できる。
import os
relative = 'data/file.txt'
absolute = os.path.abspath(relative)
print(absolute) # /home/user/project/data/file.txt
現在の作業ディレクトリを基準に絶対パスが生成される。ファイルが実際に存在するかどうかは確認されない。
pathlib を使う方法
pathlib では resolve() メソッドで絶対パスに変換できる。
from pathlib import Path
relative = Path('data/file.txt')
absolute = relative.resolve()
print(absolute) # /home/user/project/data/file.txt
resolve() はシンボリックリンクも解決する。Python 3.6 以降では、ファイルが存在しなくてもエラーにならない。
絶対パスを相対パスに変換する
os.path.relpath() を使うと、絶対パスを相対パスに変換できる。
import os
absolute = '/home/user/project/data/file.txt'
relative = os.path.relpath(absolute)
print(relative) # data/file.txt(現在のディレクトリが /home/user/project の場合)
第2引数で基準となるディレクトリを指定できる。
import os
absolute = '/home/user/project/data/file.txt'
relative = os.path.relpath(absolute, '/home/user')
print(relative) # project/data/file.txt
pathlib で相対パスに変換する
pathlib では relative_to() メソッドを使う。
from pathlib import Path
absolute = Path('/home/user/project/data/file.txt')
base = Path('/home/user/project')
relative = absolute.relative_to(base)
print(relative) # data/file.txt
relative_to() は、基準パスがターゲットパスの親でない場合に ValueError を発生させる。
絶対パスかどうかを判定する
パスが絶対パスかどうかを判定するには os.path.isabs() または Path.is_absolute() を使う。
import os
from pathlib import Path
# os.path
print(os.path.isabs('/home/user')) # True
print(os.path.isabs('data/file')) # False
# pathlib
print(Path('/home/user').is_absolute()) # True
print(Path('data/file').is_absolute()) # False