Pythonのbasenameの使い方: パスのファイル名部分を抽出する
- 作成日: 2021-05-21
- 更新日: 2023-12-24
- カテゴリ: Python
Pythonのbasenameの使い方
Pythonにはパスに関するモジュールos.pathがあります。
このモジュールを使うとパスの操作を簡単に行うことが可能です。
パスのファイル名部分を抽出したい場合はos.path.basename()
を使います。
これを使うとパスからファイル名部分を抽出できます。
結論から言うとos.path.basename()
は↓のように使います。
import os
path = '/path/to/file.txt'
fname = os.path.basename(path)
print(fname)
# file.txt
この記事ではos.path.basename()
の使い方と、パスからファイル名を取得する方法を見ていきたいと思います。
- basename()の構造
- basename()をインポートして使う
- basename()でファイル名を取得
- basename()とPathオブジェクト
- split()でファイル名を取得
basename()の構造
os.path.basename()
は↓のような構造になっています。
os.path.basename(path)
os.path.basename()
は引数を1つ取り、文字列またはバイト列の返り値を返します。
第1引数のpath
には文字列またはバイト列のパスのほか、Path
オブジェクトも指定することができます。
os.path.basename()
は引数path
のファイル名部分を返り値として返します。
UNIX系のコマンドのbasename
とは挙動が違うので注意が必要です。
UNIX系のbasename
は/path/to/dir/
に対してdir
を返します。しかしos.path.basename()
は空文字列を返します。
basename()をインポートして使う
os.path.basename()
をインポートして使うには↓のようにos
モジュールをインポートします。
import os
fname = os.path.basename('/path/to/file.txt')
print(fname)
# file.txt
またはfrom
を使ってbasename
のみを↓のようにインポートしても使えます。
from os.path import basename
fname = basename('/path/to/file.txt')
print(fname)
# file.txt
basename()でファイル名を取得
os.path.basename()
の第1引数に文字列のパスを指定すると、os.path.basename()
は返り値としてそのパスのファイル名部分を文字列として返します。
import os
path = '/path/to/file.txt'
fname = os.path.basename(path)
print(fname)
# file.txt
os.path.basename()
にはバイト列を渡すこともできます。
バイト列を渡した場合は返り値もバイト列として返ってきます。
path = b'/path/to/file.txt'
fname = os.path.basename(path)
print(fname)
# b'file.txt'
None
などのオブジェクトをos.path.basename()
に渡した場合は、↓のように例外TypeError
が送出されます。
try:
os.path.basename(None)
except TypeError as e:
print(e)
# expected str, bytes or os.PathLike object, not NoneType
basename()とPathオブジェクト
Path
オブジェクトとはpathlib
から使うことのできるパスを扱うオブジェクトです。
Path
を使うにはpathlib
からインポートします。
import os
from pathlib import Path
path = Path('/path/to/file.txt')
fname = os.path.basename(path)
print(fname)
# file.txt
↑のようにPath
オブジェクトはos.path.basename()
に渡すことができます。
split()でファイル名を取得
os.path.split()
を使ってもパスからファイル名部分を抽出することができます。
os.path.split()
はパスをセパレータで一部分割します(すべてを分割するわけではないので注意が必要です)。
import os
path = '/path/to/file.txt'
toks = os.path.split(path)
print(toks)
# ('/path/to', 'file.txt')
fname = toks[-1]
print(fname)
# file.txt
省略した記法は↓のようになります。
fname = os.path.split('/path/to/file.txt')[-1]
print(fname)
# file.txt
os.path.split()
を使う場合はディレクトリ名も取得できます。
path = '/path/to/dir'
dirname = os.path.split(path)[-1]
print(dirname)
# dir
ただしディレクトリ名を取得する場合はos.path.dirname()
という専用の関数があるので、こちらを使ったほうが良いでしょう。
path = '/path/to/dir'
dirname = os.path.dirname(path)
print(dirname)
# dir
str.split()
を使ってもファイル名は抽出できます。
path = '/path/to/file.txt'
toks = path.split('/')
print(toks)
# ['', 'path', 'to', 'file.txt']
fname = toks[-1]
print(fname)
# file.txt
ただし↑の書き方だと移植性が低くなります。というのも、Windowsではパスのセパレータが\
だからです。
そのためos.path.sep
と併用します。os.path.sep
はWindowsの場合はその値が\
になります。そのため移植性があります。
print(os.path.sep)
# /
path = '/path/to/file.txt'
toks = path.split(os.path.sep)
print(toks)
# ['', 'path', 'to', 'file.txt']
fname = toks[-1]
print(fname)
# file.txt
おわりに
今回はPythonのos.path.basename()
とファイル名の抽出方法について見てみました。
ファイル名を抽出するケースはけっこうよくありますよね。
🦝 < パスをドリップしよう