🐍 Python

with_name() / with_suffix() で一部だけ変えた新しいパスを作る

同じディレクトリの別ファイルや、拡張子だけ違うファイルのパスを作りたいとき、文字列操作で組み立て直すよりwith_name()やwith_suffix()を使うほうが簡潔で誤りが起きにくくなります。どちらも新しいPathを返し、元のオブジェクトは変わりません。

p.with_name("new_name.ext")  # ファイル名部分だけを丸ごと差し替える
p.with_suffix(".ext")        # 拡張子だけを差し替える
p.with_stem("new_stem")      # 拡張子を除いた部分だけを差し替える(Python 3.9+)
from pathlib import Path

orig = Path("folder/report.txt")
print(orig.with_name("summary.txt"))
# folder\summary.txt
# 拡張子だけを変えたい場合はwith_suffix()
from pathlib import Path

orig = Path("folder/report.txt")
print(orig.with_suffix(".csv"))
# folder\report.csv
# ファイル名(拡張子除く)だけを変えたい場合はwith_stem()(3.9以降)
from pathlib import Path

orig = Path("folder/report.txt")
print(orig.with_stem("final_report"))
# folder\final_report.txt
3メソッドの対応範囲
with_name(name)
最後の要素(ファイル名+拡張子)を丸ごと置き換える
with_suffix(suffix)
拡張子部分だけを置き換える。"."から書く必要がある(".csv"であって"csv"ではない)
with_stem(stem)
拡張子を除いた部分だけを置き換える。Python 3.9で追加された比較的新しいメソッド
💡 AIコードレビュー観点:元のPathは変更されない(イミュータブル)

Pathオブジェクトはイミュータブル(変更不可)なので、with_name()やwith_suffix()は元のオブジェクトを書き換えず、常に新しいPathを返します。AIが生成したコードでp.with_suffix(".bak")とだけ書いて戻り値を変数に代入していない場合、その呼び出しは何の効果もない(結果が捨てられる)バグです。new_p = p.with_suffix(".bak")のように必ず受け取りましょう。また、実行環境がPython 3.9未満だとwith_stem()はAttributeErrorになるので、対応バージョンの確認も必要です。

← Python pathlib クイックリファレンス一覧へ戻る / name/suffix/stemでパスを分解する →