Python で絶対パスと相対パスを変換する

相対パスと絶対パスを相互に変換するには 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