Python でファイル名から拡張子を除いた部分を取得する(stem, splitext)

ファイル名から拡張子を除いた部分(ベース名)を取得するには os.path.splitext() または pathlib.Path.stem を使う。

import os

path = 'document.pdf'
name, ext = os.path.splitext(path)

print(name)  # document

os.path.splitext() はファイル名を拡張子の前後で分割するため、最初の要素が拡張子を除いた部分になる。

pathlib の stem を使う

pathlib では stem プロパティで直接取得できる。

from pathlib import Path

path = Path('document.pdf')
print(path.stem)  # document

stem は最後の拡張子だけを除くため、.tar.gz のようなファイルでは .tar が残る。

from pathlib import Path

path = Path('archive.tar.gz')
print(path.stem)  # archive.tar

すべての拡張子を除く

複数の拡張子をすべて除きたい場合は、stem を繰り返し適用するか、拡張子がなくなるまでループする。

from pathlib import Path

path = Path('archive.tar.gz')

while path.suffix:
    path = Path(path.stem)

print(path)  # archive

または suffixes の長さ分だけ処理する方法もある。

from pathlib import Path

path = Path('archive.tar.gz')
name = path.name

for suffix in path.suffixes:
    name = name.removesuffix(suffix)

print(name)  # archive

ディレクトリパスからファイル名部分を取得する

フルパスからファイル名部分だけを取得するには os.path.basename() または Path.name を使う。

import os
from pathlib import Path

full_path = '/home/user/documents/report.pdf'

# os.path
print(os.path.basename(full_path))  # report.pdf

# pathlib
print(Path(full_path).name)  # report.pdf

ファイル名から拡張子を除くには、これを splitext()stem と組み合わせる。

import os
from pathlib import Path

full_path = '/home/user/documents/report.pdf'

# os.path
basename = os.path.basename(full_path)
name = os.path.splitext(basename)[0]
print(name)  # report

# pathlib
print(Path(full_path).stem)  # report

pathlib の方が簡潔に書けることがわかる。