【Python】絶対パス・相対パスの取得方法(os.pathモジュール)

Python ファイル操作

Pythonで絶対パス・相対パスを扱う際はos.pathモジュールを使います。
本記事では、主に以下の操作について具体例を挙げながら分かりやすく解説します。

  • 絶対パスの取得: os.path.abspath()
  • 絶対パス/相対パスの判別: os.path.isabs()
  • 相対パスの取得: os.path.relpath()
  • パスのhead/tail分離: os.path.split()
  • ディレクトリ名の取得: os.path.dirname()
  • ベース名の取得: os.path.basename()

フォルダ構成の例

パス名を操作するにあたって、以下のフォルダ構成を例にして解説していきます。

#カレントディレクトリの絶対パス
$ pwd
/home/hibikisan/folder00

# folder00フォルダの中身
$ tree
.
├── sample00
│   └── file01.txt
└── sample01

2 directories, 1 file

パスの自動生成

パスの表し方はOSによって異なります。
例えばWindowsはフォルダ名間を’\’で区切りますが、MacやLinuxでは’/’を用います。
os.path.join() はこのようなOS依存の区切り文字を自動で付け加えて、現在のOSに適したパスを返します。以下は、Linuxの例です。

>>> import os.path
# カレントディレクトリの取得
>>> dirname = os.getcwd()

# カレントディレクトリとファイル名からパスを生成
>>> os.path.join(dirname, 'file02.txt')
'/home/hibikisan/folder00/sample00/file02.txt'

参考記事)【Python】カレントディレクトリの取得方法(osモジュール、pathlibモジュール)

絶対パスを取得する

あるファイル/フォルダの相対パスをos.path.abspath() に渡すと、絶対パスが得られます。以下に例を示します。

>>> import os.path

#絶対パスの取得
>>> os.path.abspath('./sample00/')
'/home/hibikisan/folder00/sample00'

尚、normpath() を使って同じ機能を書くことが出来ます。

>>> os.path.normpath(os.path.join(os.getcwd(), './sample00/'))
'/home/hibikisan/folder00/sample00'

絶対パスか相対パスを判定する

指定したpathが絶対パスか相対パスを判定するには、os.path.isabs() を使います。

pathが絶対パスならTure、相対パスならFalseを返します。

>>> import os.path

#相対パスの場合
>>> os.path.isabs('./sample00/')
False

#絶対パスの場合
>>> os.path.isabs(os.path.abspath('./sample00/'))
True

カレントディレクトリまたは指定のディレクトリからの相対パスを取得する

指定のディレクトリからの相対パスを取得するには、os.path.relpath() を用います。

第二引数startから見た、第一引数pathの相対パスが返ります。
第二引数startの指定がない場合はデフォルト設定のカレントディレクトリからの相対パスを返します。

>>> import os.path

# sample00フォルダからtmpフォルダへの相対パス
>>> os.path.relpath('/tmp/', './sample00/')
'../../../../tmp'

パスをhead部とtail部分離する

パスの最後の部分(スラッシュ”/”は含まれない)をtail、それより前の全ての部分をheadと呼びます。
os.path.split() はパスをtailheadに分離してタプルで返します。

>>> import os.path
>>> path = os.path.abspath('./sample00/file01.txt')

#パスをheadとtailに分離してタプルで返却
>>> os.path.split(path)
('/home/hibikisan/folder00/sample00', 'file01.txt')

引数pathの記述によって空文字を返す場合があります。
以下にその例を挙げます。

#pathがパス区切り(linuxの場合は'/')で終わっている場合 → "tail"は空を返却
>>> path = "/home/hibikisan/folder00/sample00/"
>>> os.path.split(path)
('/home/hibikisan/folder00/sample00', '')

#pathにパス区切り(linuxの場合は'/')が一つもない場合 → "head"は空を返却
>>> path = "file01.txt"
>>> os.path.split(path)
('', 'file01.txt')

#pathが空の場合 → "tail"と"head"の両方とも空を返却
>>> path = ''
>>> os.path.split(path)
('', '')

尚、head のパス区切り(linuxの場合は’/’)は削除されますが、head がルートディレクトリ (または 1 個以上のスラッシュだけ) の場合は残ります。

>>> path = os.path.abspath('/home')
>>> os.path.split(path)
('/', 'home')

パスのディレクトリ名、ベース名を取得する

パスの最後のパス区切りの前をディレクトリ名(dirname)、後をベース名(basename)と呼びます。

パスのディレクトリ名とベース名

それぞれ、

で取得できます。

>>>import os.path
>>> path = "/home/hibikisan/folder00/sample00/file01.txt"

#ディレクトリ名の取得 (split()の返却値の一番目の要素(=head)に相当)
>>> os.path.dirname(path)
'/home/hibikisan/folder00/sample00'

#ベース名の取得 (split()メソッドの返却値の二番目の要素(=tail)に相当)
>>> os.path.basename(path)
'file01.txt'

環境

  • OS: Ubuntu20.04LTS@Windoes10 WLS2
  • Python3.9.0

参考書籍

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project