ファイル名から拡張子を除いた部分(ベース名)を取得するには 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 の方が簡潔に書けることがわかる。