Python pathlibで絶対パスと相対パスを相互変換・判定する方法

 

絶対パスと相対パスの判定

is_absolute() – 絶対パスかどうかの判定

from pathlib import Path

# 絶対パスの例
abs_path = Path('/home/user/documents/file.txt')
print(abs_path.is_absolute())  # True

# 相対パスの例
rel_path = Path('documents/file.txt')
print(rel_path.is_absolute())  # False

# Windowsの場合
win_abs = Path('C:/Users/user/file.txt')
print(win_abs.is_absolute())  # True

相対パスから絶対パスへの変換

resolve() – 絶対パスへの変換

from pathlib import Path

# 現在のディレクトリからの相対パス
rel_path = Path('data/sample.txt')
abs_path = rel_path.resolve()
print(abs_path)  # /current/directory/data/sample.txt

absolute() – 絶対パスへの変換(非正規化)

from pathlib import Path

rel_path = Path('../data/sample.txt')
abs_path = rel_path.absolute()
print(abs_path)  # シンボリックリンクを解決しない

絶対パスから相対パスへの変換

relative_to() – 基準パスからの相対パスを取得

from pathlib import Path

# 絶対パス
abs_path = Path('/home/user/documents/data/sample.txt')
base_path = Path('/home/user/documents')

# 相対パスに変換
rel_path = abs_path.relative_to(base_path)
print(rel_path)  # data/sample.txt

現在のディレクトリからの相対パスを取得

from pathlib import Path
import os

# 現在のディレクトリ
current_dir = Path.cwd()
target_path = Path('/home/user/documents/file.txt')

try:
    rel_path = target_path.relative_to(current_dir)
    print(f'相対パス: {rel_path}')
except ValueError:
    print('相対パスに変換できません')

パスの正規化

resolve()による正規化

from pathlib import Path

# .. や . を含むパス
messy_path = Path('./data/../data/./sample.txt')
clean_path = messy_path.resolve()
print(clean_path)  # 正規化されたパス

実用的な使用例

プロジェクトルートからの相対パス取得

from pathlib import Path

def get_project_relative_path(file_path, project_root):
    """プロジェクトルートからの相対パスを取得"""
    file_path = Path(file_path).resolve()
    project_root = Path(project_root).resolve()
    
    try:
        return file_path.relative_to(project_root)
    except ValueError:
        return None

# 使用例
project_root = Path('/home/user/myproject')
file_path = Path('/home/user/myproject/src/main.py')
rel_path = get_project_relative_path(file_path, project_root)
print(rel_path)  # src/main.py

設定ファイルの場所を動的に決定

from pathlib import Path

def get_config_path():
    """設定ファイルのパスを取得"""
    # スクリプトの場所を基準にする
    script_dir = Path(__file__).parent
    config_path = script_dir / 'config' / 'settings.ini'
    return config_path.resolve()

config_path = get_config_path()
print(config_path)

エラーハンドリング

relative_to()のエラー対処

from pathlib import Path

def safe_relative_to(path, base):
    """安全な相対パス変換"""
    try:
        return Path(path).relative_to(base)
    except ValueError as e:
        print(f'相対パス変換エラー: {e}')
        return None

# 使用例
result = safe_relative_to('/tmp/file.txt', '/home/user')
if result:
    print(f'相対パス: {result}')
else:
    print('変換できませんでした')

まとめ

pathlibを使った絶対パスと相対パスの変換は、従来のos.pathよりも直感的で読みやすいコードが書けます。特にresolve()relative_to()メソッドを組み合わせることで、柔軟なパス操作が可能になります。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座