🐍 Python
name / suffix / stem でパスを分解する
ファイル名から拡張子だけ、ディレクトリ名だけを取り出したい場面はよくあります。pathlibは文字列のスライスを使わずに、これらの構成要素をプロパティとして直接取得できます。
p.name # 最後の要素(ファイル名+拡張子)
p.suffix # 最後の拡張子(1つだけ)
p.suffixes # 拡張子を全て(リスト)
p.stem # 拡張子を除いたファイル名
p.parent # 親ディレクトリ
p.parts # 各要素を分解したタプル
from pathlib import Path
p = Path("folder/sub/report.tar.gz")
print(p.name)
# report.tar.gz
print(p.suffix)
# .gz
print(p.suffixes)
# ['.tar', '.gz']
# stemは拡張子を1つだけ除いた名前(.tar.gzの場合.gzだけ除く)
from pathlib import Path
p = Path("folder/sub/report.tar.gz")
print(p.stem)
# report.tar
print(p.parent)
# folder\sub
print(p.parts)
# ('folder', 'sub', 'report.tar.gz')
# 拡張子が無いファイルは suffix が空文字列
from pathlib import Path
p_noext = Path("folder/README")
print(p_noext.suffix)
# (空文字列)
print(p_noext.stem)
# README
各プロパティの対応関係
name=stem+suffix- ただし拡張子が複数ある場合、
suffixは最後の1つだけでstemにはそれ以外の拡張子が残る点に注意 suffixes- 全ての拡張子をリストで取得する。
report.tar.gzなら['.tar', '.gz']
💡 AIコードレビュー観点:複数拡張子ファイルのstemの扱い
「拡張子を完全に除いたファイル名が欲しい」という意図でp.stemを使うと、report.tar.gzのような複数拡張子のファイルではreport.tarが残ってしまい、想定と異なる結果になります。完全に拡張子を除去したい場合は、p.name.split(".")[0]のように分割するか、suffixesの数だけwith_suffix("")を繰り返す必要があります。AIが生成したコードで.tar.gzや.min.jsのような複数拡張子ファイルを扱っている場合は、このズレに注意しましょう。
← Python pathlib クイックリファレンス一覧へ戻る / with_name/with_suffixで新しいパスを作る →