高校生物550643 views
数学講師2870390 views
小学算数1197982 views
英語610681 views
小学理科718465 views
中学理科1628645 views
りんご201251 views
LaTeX959517 views
教育149228 views
雑学1473151 views

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 の方が簡潔に書けることがわかる。