HOWTO · Python
Python パスから拡張子なしのファイル名を取得する
このチュートリアルでは、Python でファイルパスから拡張子なしのファイル名を取得する方法を説明します。
このページの内容
パスから最後の拡張子を除いたファイル名を取得するには、Path(file_path).stem を使います。たとえば、Desktop/folder/myfile.txt の stem は myfile です。Path.stem はプロパティなので、かっこを付けずに参照します。以下の例では、パス文字列から名前を取得して出力します。
Path.stem で最後の拡張子を除いたファイル名を取得する
pathlib.Path は現在のプラットフォームに応じたパス区切り文字を扱うため、自分でパスを分割する必要はありません。文字列から Path を作成し、その stem プロパティを参照します。これにより、ファイル名に含まれる前のドットは残したまま、最後の拡張子を除けます。
次の例を実行します。
この例のコード内のラベルと表示文は英語のままです。
from pathlib import Path
file_path = "Desktop/folder/myfile.txt"
file_name = Path(file_path).stem
print(file_name)
myfile
os.path.splitext() で最後の拡張子を除く
標準ライブラリの関数 os.path.splitext() は、最後の拡張子より前のパス部分と拡張子をペアで返します。最初の要素を選ぶと、その拡張子を取り除けます。パスの最後の要素だけが必要なら、この例では / で分割できます。ただし、この方法はその区切り文字に依存するため、OS 間の移植性が低くなります。
次の例を実行します。
この例のコード内のラベルと表示文は英語のままです。
import os
file_path = "Desktop/folder/myfile.txt"
path_without_suffix = os.path.splitext(file_path)[0]
file_name = path_without_suffix.split("/")[-1]
print(file_name)
myfile
拡張子を除く前にベース名を取り出す
os.path でパスを扱う場合は、まず os.path.basename() を呼び出して最後の要素を取得し、その結果を os.path.splitext() に渡します。Desktop/folder/myfile.txt のベース名は myfile.txt で、最後の拡張子を取り除くと myfile になります。この方法なら、パス区切り文字を自分で選ぶ必要はありません。
次の例を実行します。
この例のコード内のラベルと表示文は英語のままです。
import os
file_path = "Desktop/folder/myfile.txt"
basename = os.path.basename(file_path)
file_name = os.path.splitext(basename)[0]
print(file_name)
myfile
複合拡張子とファイル名のドットを扱う
ここまでの標準的な方法で取り除けるのは、ドットで区切られた部分すべてではなく、最後の拡張子ひとつです。myfile.tar.gz に対して Path.stem と os.path.splitext() は、どちらも myfile.tar を返します。.gz だけを拡張子として扱う場合には、これで十分です。アプリケーションで .tar.gz 全体を複合拡張子として扱うなら、たとえば name.removesuffix(".tar.gz") のように、その拡張子を明示して処理します。str.removesuffix() は Python 3.9 で追加されたため、この式には Python 3.9 以降が必要です。それ以前のバージョンでは、name[:-len(".tar.gz")] if name.endswith(".tar.gz") else name を使うと、その末尾だけを安全に取り除けます。
README のように拡張子のない名前は、Path.stem と os.path.splitext() のどちらを使っても README のままです。.bashrc のように先頭がドットの名前は、拡張子のないドットファイルとして扱われます。Path(".bashrc").stem と os.path.splitext(".bashrc")[0] は、どちらも .bashrc を返します。一方、archive. の末尾のドットは、Path.stem では保持されて archive. となりますが、os.path.splitext() では拡張子として扱われ、archive が返ります。
最初のドットで分割すると動作が異なり、名前の残りの部分が切り捨てられます。my.file.tar.gz を最初のドットで分割すると my になりますが、最後の拡張子だけを取り除くと my.file.tar になります。複合拡張子を明示して取り除くのか、最後の拡張子だけを取り除くのか、それとも最初のドット以降をすべて取り除くのかに応じて選んでください。最初のドットで分割すると .bashrc は空文字列になるため、先頭がドットの名前を保持したい場合には適しません。
次の例を実行します。
この例のコード内のラベルと表示文は英語のままです。
from pathlib import Path
for name in ("myfile.tar.gz", "my.file.tar.gz"):
print(Path(name).stem)
print(name.split(".", 1)[0])
myfile.tar
myfile
my.file.tar
my