ユーニックス総合研究所

  • home
  • archives
  • python-basename

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()とファイル名の抽出方法について見てみました。
ファイル名を抽出するケースはけっこうよくありますよね。

🦝 < パスをドリップしよう