HOWTO · Python

Python でパスからファイル名を取得する方法

このチュートリアルでは、os.path.split()、os.path.basename()、ntpath.basename()、pathlib.Path.name など、Python でファイルパスからファイル名を抽出するさまざまな方法を紹介します。

このページの内容

プログラミングでは、与えられたファイルパスからファイル名を抽出する必要があることがよくあります。C:\Documents\Project\file.txt のようなファイルパスがあり、ファイル名だけ、つまり file.txt を取り出したい場面を考えてみましょう。これはファイル管理、データ分析、Web 開発における日常的な作業であり、Python にはそれを行う方法がいくつか用意されています。

このチュートリアルでは、Python でパスからファイル名を取得する 4 つの方法、os.path.split()、os.path.basename()、ntpath.basename()、pathlib.Path.name を紹介します。これらの違いは主に、ファイル名以外に何が得られるか、そしてコードを実行する OS とは異なる OS 向けに書かれたパスをどう扱うかにあります。

os.path.split() 関数を使用して Python でパスからファイル名を取得する

os.path.split() 関数はファイルパスをディレクトリ部分とファイル名部分に分割します。そのため、ファイル名の部分だけを取り出すことも、ディレクトリも必要な場合は両方を保持することもできます。

構文:

import os

directory, filename = os.path.split(path)

パラメーター:os.path.split() 関数は 1 つのパラメーターを受け取ります。

  • path:このパラメーターは、ファイル名を抽出したいファイルパスを表します。ファイルの絶対パスまたは相対パスを含む文字列です。

戻り値:この関数は 2 つの要素を含むタプルを返します。

  • directory:この変数には、ファイル名を除いたパスのディレクトリ部分が入ります。

  • filename:この変数には、パスから抽出されたファイル名が入ります。

次のコードスニペットは、os.path.split() 関数を使って Python でパスからファイル名を取得する方法を示しています。

import os

directory, filename = os.path.split("MyFolder/MySubFolder/MyFile.txt")
print(directory)
print(filename)

出力:

MyFolder/MySubFolder
MyFile.txt

変数 directory にはファイルパスのディレクトリ部分である MyFolder/MySubFolder が、変数 filename には抽出されたファイル名 MyFile.txt が入ります。両方の部分が必要な場合はこの方法を使いましょう。ファイル名だけが必要なら、次の方法のほうが短くなります。

os.path.basename() 関数を使用して Python でパスからファイル名を取得する

os.path.basename() 関数はパスの最後の要素を返します。これは通常、ファイル名です。この関数は os.path モジュールの一部であり、その区切り文字の規則はコードを実行する OS に従います。

構文:

import os

filename = os.path.basename(path)

パラメーター:os.path.basename() 関数は 1 つのパラメーターを受け取ります。

  • path:このパラメーターは、ファイル名を抽出したいファイルパスを表します。ファイルの絶対パスまたは相対パスを含む文字列です。

戻り値:この関数は、与えられたパスから抽出されたファイル名を表す文字列を返します。

os.path.basename() と os.path.split() はどちらもパスからファイル名を抽出できますが、os.path.basename() はファイル名の部分だけに集中し、それを文字列として返すため、ディレクトリ部分が不要な場合にはより分かりやすい選択肢です。

import os

filename = os.path.basename("MyFolder/MySubFolder/MyFile.txt")
print(filename)

出力:

MyFile.txt

結果であるファイル名 MyFile.txt が変数 filename に代入され、出力されます。

ntpath ライブラリを使用して Python でパスからファイル名を取得する

Python の ntpath モジュールは、コードが実際にどのシステムで実行されていても、Windows パス向けのパス操作を実装しています。これは、Linux や macOS のマシンで Windows 形式のパスを処理しなければならないときに重要です。そうした環境では os.path.basename() はバックスラッシュを区切り文字として扱わないため、os.path.basename("MyFolder\\MySubFolder\\MyFile.txt") は文字列全体を返しますが、ntpath.basename() はファイル名を返します。

構文:

import ntpath

filename = ntpath.basename(path)

パラメーター:ntpath.basename() 関数は 1 つのパラメーターを受け取ります。

  • path:このパラメーターは、ファイル名を抽出したいファイルパスを表します。ファイルの絶対パスまたは相対パスを含む文字列です。

戻り値:この関数は、与えられたパスから抽出されたファイル名を表す文字列を返します。

次のコードスニペットは、ntpath.basename() 関数を使って Python で Windows パスからファイル名を取得する方法を示しています。

import ntpath

filename = ntpath.basename("MyFolder\\MySubFolder\\MyFile.txt")
print(filename)

出力:

MyFile.txt

処理するパスが Windows パスだがコードはどこででも動く可能性がある場合は ntpath を使いましょう。Windows マシンでは os.path がすでに同じ規則に従うため、両者は同じように動作します。

pathlib モジュールを使用して Python でパスからファイル名を取得する

pathlib モジュールは、ファイルパスを扱うためのオブジェクト指向のアプローチを提供します。その Path クラスはパス関連の操作をカプセル化し、ファイル名は Path オブジェクトの .name 属性として直接利用できます。

from pathlib import Path

filename = Path("MyFolder/MySubFolder/MyFile.txt").name
print(filename)

出力:

MyFile.txt

.name のほかに、同じオブジェクトから親ディレクトリ(.parent)、拡張子(.suffix)、拡張子なしのファイル名(.stem)も得られるため、ファイル名以上のものが必要な場合には pathlib が便利な選択肢となります。

結論

Python でファイルパスからファイル名を抽出する 4 つの異なる方法、os.path.split()、os.path.basename()、ntpath.basename()、pathlib.Path.name を見てきました。各方法には長所と短所があり、さまざまな場面に適しています。

os.path.split() メソッドはパスをディレクトリ部分とファイル名部分に分割できます。この細かさによりパスをより細かく制御できますが、ファイル名だけにアクセスするには追加のコードが必要です。ただし、さまざまな OS で動作するため汎用性があります。

一方、os.path.basename() はパスからファイル名を直接抽出する、よりシンプルなアプローチを提供します。さまざまなプラットフォームと互換性があり、分かりやすい解決策を提供します。ただし、ファイル名を文字列として返すだけです。

Windows 固有のパスについては、ntpath.basename() がどの OS でもこれらのパスを扱えるよう設計されています。追加のコードなしにファイル名を直接抽出します。ただし、Windows パスに限定され、クロスプラットフォーム互換性はありません。

最後に、pathlib.Path.name はパスを扱うためのオブジェクト指向のアプローチを提供します。さらなるパス操作が可能で、他の pathlib 機能ともよく統合されます。ただし、単純なファイル名の抽出にはいくらかの複雑さが加わり、pathlib モジュールのインポートが必要です。