Pythonのbasenameの使い方: パスのファイル名部分を抽出する

255, 2021-05-21

目次

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

(^ _ ^)

パスをドリップしよう



この記事のアンケートを送信する