Pythonでパスの末尾(ファイル名)とディレクトリを分離する:os.path.splitの使い方

ファイルパスを扱うプログラムでは、「フルパスからファイル名だけを取り出したい」あるいは「ファイル名を除いた親ディレクトリのパスを取得したい」という操作が頻繁に発生します。

Pythonの標準ライブラリ os.path モジュールにある split() 関数を使用すると、パスを「末尾部分(tail)」と「それ以前の部分(head)」に簡単に分割できます。

この記事では、os.path.split() の基本的な挙動と、パスの末尾に区切り文字がある場合の注意点について解説します。

目次

os.path.split() の基本

os.path.split() は、引数に渡されたパス文字列を、以下の2つの要素を持つタプルに分割して返します。

  1. head (ヘッド): 末尾の要素を除いたディレクトリパス
  2. 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() の利用も検討してください。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次