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