ファイルパスを扱うプログラムでは、「フルパスからファイル名だけを取り出したい」あるいは「ファイル名を除いた親ディレクトリのパスを取得したい」という操作が頻繁に発生します。
Pythonの標準ライブラリ os.path モジュールにある split() 関数を使用すると、パスを「末尾部分(tail)」と「それ以前の部分(head)」に簡単に分割できます。
この記事では、os.path.split() の基本的な挙動と、パスの末尾に区切り文字がある場合の注意点について解説します。
os.path.split() の基本
os.path.split() は、引数に渡されたパス文字列を、以下の2つの要素を持つタプルに分割して返します。
- head (ヘッド): 末尾の要素を除いたディレクトリパス
- tail (テール): 末尾の要素(ファイル名、または末尾のディレクトリ名)
構文:
import os
head, tail = os.path.split(パス文字列)
具体的な使用例:ファイルパスの分割
ファイルを含む一般的なパスを分割する例です。
import os
# サンプルのファイルパス
# (Windows環境では \ 、Mac/Linuxでは / が区切り文字になります)
file_path = os.path.join("documents", "reports", "monthly.csv")
print(f"元のパス: {file_path}")
# パスを分割
directory, filename = os.path.split(file_path)
print(f"ディレクトリ (head): {directory}")
print(f"ファイル名 (tail): {filename}")
実行結果(Windowsの場合):
元のパス: documents\reports\monthly.csv
ディレクトリ (head): documents\reports
ファイル名 (tail): monthly.csv
このように、最後の区切り文字でスパッと切り分けられます。
【重要】末尾が区切り文字で終わっている場合
os.path.split() を使う上で最も注意が必要なのは、パスの末尾が区切り文字(/ や \)で終わっているケースです。
この場合、tail(末尾部分)は空文字列 "" になります。
import os
# 末尾に区切り文字があるディレクトリパス
dir_path_with_sep = os.path.join("backup", "data") + os.sep
print(f"元のパス: {dir_path_with_sep}")
head, tail = os.path.split(dir_path_with_sep)
print(f"head: '{head}'")
print(f"tail: '{tail}'")
実行結果(Windowsの場合):
元のパス: backup\data\
head: 'backup\data'
tail: ''
直感的には data が取れそうに思えますが、実際には 「最後の区切り文字より後ろ(つまり空)」 が tail と判定されるためです。末尾のディレクトリ名を取得したい場合は、事前に .rstrip(os.sep) などで区切り文字を除去する必要があります。
補足:片方だけ取得したい場合
分割された両方の値が必要なわけではなく、「ファイル名だけ」あるいは「ディレクトリパスだけ」が欲しい場合は、専用の関数を使う方がコードが読みやすくなります。
os.path.basename(path):tailだけを返します。os.path.dirname(path):headだけを返します。
path = os.path.join("images", "photo.jpg")
# tail と同じ結果
print(os.path.basename(path)) # -> photo.jpg
# head と同じ結果
print(os.path.dirname(path)) # -> images
まとめ
os.path.split()は、パスを(head, tail)のタプルに分割します。headはディレクトリ部分、tailは末尾のファイル名(またはフォルダ名)です。- パスの末尾が区切り文字の場合、
tailは空文字列になります。 - 片方だけ必要な場合は
os.path.basename()やos.path.dirname()の利用も検討してください。
