ユーニックス総合研究所

  • home
  • archives
  • python-abs-path

Pythonで絶対パスを取得する方法と関連技術

  • 作成日: 2023-06-19
  • 更新日: 2023-12-24
  • カテゴリ: Python

Pythonで絶対パスを取得する方法

Pythonで絶対パスを取得するにはos.path.abspath()関数を使います。

import os  


path = 'path/to/dir'  
abs_path = os.path.abspath(path)  

print(abs_path)  
# /home/username/path/to/dir  

現在のディレクトリはos.curdirで取得できますので、これをos.path.abspath()に渡せば現在のディレクトリの絶対パスが得られます。

import os  


abs_path = os.path.abspath(os.curdir)  
print(abs_path)  
# /home/username/  

また__file__変数をos.path.abspath()に渡したらモジュールの絶対パスが得られます。

import os  


abs_path = os.path.abspath(__file__)  
print(abs_path)  
# /home/username/main.py  

「..」の処理

os.path.abspath()は「..」などを解決してパスを生成します。

import os  


abs_path = os.path.abspath('../path/to/dir')  
print(abs_path)  
# /home/path/to/dir  

「..」の解決にはos.path.normpath()なども使えます。
ただしos.path.normpath()は絶対パスとしてパスを返しません。

import os  


norm_path = os.path.normpath('../path/to/dir')  
print(norm_path)  
# ../path/to/dir  

norm_path = os.path.normpath('path/../to/dir')  
print(norm_path)  
# to/dir  

また出力を見てもわかるように先頭の「..」は解決しません。

絶対パスを分割する

os.sepに環境で使われるパスが格納されています。
これでパスを分割するとパスを分割できます。

import os  


abs_path = os.path.abspath(os.curdir)  
toks = abs_path.split(os.sep)  
print(toks)  
# ['', 'home', 'username']  

ただしos.sepはLinux系なら/になってWindowsなら\になります。
ですので分割したいパスがどちらのセパレーターを使っているのかによっては期待した結果にならない場合もあります。

絶対パス同士の差分を取る

2つの絶対パスがあり、長いパスから短いパスをreplaceすると差分が得られます。

import os  


def diff_path(a, b):  
    if len(a) > len(b):  
        return a.replace(b, '')  
    else:  
        return b.replace(a, '')  


a = os.path.abspath('.')  
b = os.path.abspath('hoge/sample.txt')  

print(a)  
# /home/username  

print(b)  
# /home/username/hoge/sample.txt  

diff = diff_path(a, b)  
print(diff)  
# /hoge/sample.txt