[Python] パスの自動生成および絶対パス・相対パスの取得(os.pathモジュール)

Python ファイル操作

Python標準ライブラリのosモジュールやos.pathモジュールを使うと、下記のようなディレクトリ操作やパス操作ができます。

  • osモジュールによるカレントディレクトリの取得やディレクトリの移動・新規作成
  • os.pathモジュールによるパスの自動生成や相対パス・絶対パスの取得

本記事では、これらの使い方についてまとめます。
# 2019/3/17 記事更新

確認した環境

  • OS: Ubuntu16.04LTS
  • Python 3.7.0

フォルダ構成の例

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

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

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

2 directories, 1 file

カレントディレクトリの取得と変更

今自分がどこにいるか?
カレントディレクトリを得るには、os.getcwd()を使います。以下に例を示します。

# osモジュールをインポート
>>> import os
>>> os.getcwd()
'/home/hibikisan/folder00'

ちなみに、ディレクトリを移動するには、os.chdir()を使います。

# カレントディレクトリを変更
>>> os.chdir('./sample00/')

# 確認
>>> os.getcwd()
'/home/hibikisan/folder00/sample00'

ディレクトリの新規作成

ディレクトリを新規作成するには、os.makedirs()を使います。作成するディレクトリ名を引数に設定します。

>>> import os
# カレントディレクトリの確認
>>> os.getcwd()
'/home/hibikisan/folder00'

# 'sample02'ディレクトリを作成
>>> os.makedirs('sample02')

実際にツリーを確認してみます。

$ tree
.
├── sample00
│   └── file01.txt
├── sample01
└── sample02 ★新規作成したディレクトリ

3 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'

絶対パスを取得する

あるファイル/フォルダの相対パスを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(pathstart=os.curdir)関数を用います。

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

>>> import os.path

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

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

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

>>> 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)と呼びます。

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

それぞれ、os.path.dirname()関数os.path.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モジュールを用いたディレクトリ操作、およびos.pathモジュールを用いたパス操作についてまとめました。

Learn more...

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

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