Python Path.rename()とは?ファイル名を変更する方法
PythonのPath.rename()は、ファイルやフォルダの名前を変更するpathlibのメソッドです。
別のフォルダへのパスを指定すれば移動にも使えます。
Path.rename()の基本的な使い方
from pathlib import Path
Path("old.txt").rename("new.txt")
print(Path("new.txt").exists())
実行結果:
True
戻り値は新しいPath
from pathlib import Path
p = Path("old.txt").rename("new.txt")
print(p)
print(type(p))
実行結果:
new.txt
<class 'pathlib.PosixPath'>
変更後のパスが返るため、そのまま次の処理へつなげられます(Python 3.8以降)。
from pathlib import Path
print(Path("old.txt").rename("new.txt").read_text(encoding="utf-8"))
元のPathオブジェクトは変化しません。指しているファイル名は古いままなので、続けて使うと存在しないファイルを参照します。
from pathlib import Path
p = Path("old.txt")
p.rename("new.txt")
print(p) # 古いまま
print(p.exists()) # False
実行結果:
old.txt
False
戻り値を変数で受け取るのが安全です。
移動にも使える
from pathlib import Path
dst = Path("archive") / "report.txt"
dst.parent.mkdir(parents=True, exist_ok=True)
Path("report.txt").rename(dst)
print(dst)
実行結果:
archive/report.txt
移動先のフォルダは自動では作られません。先にmkdir()で用意します。
上書きの動作がOSで違う|最大の注意点
| OS | 同名ファイルがあるとき |
|---|---|
| macOS / Linux | 黙って上書きされる |
| Windows | FileExistsError |
macOSで開発したコードがWindowsで落ちる、逆に気づかないうちにファイルが消えるという事故につながります。
これを解決するのがPath.replace()です。
from pathlib import Path
Path("new.txt").replace("exist.txt") # どのOSでも必ず上書き
上書きしてよいならreplace()を使ってください。すべてのOSで動作が統一されています。
上書きしたくない場合は、明示的に確認します。
from pathlib import Path
src, dst = Path("new.txt"), Path("exist.txt")
if dst.exists():
print(f"{dst} は既に存在します")
else:
src.rename(dst)
拡張子を変える
from pathlib import Path
p = Path("data/report.txt")
p.rename(p.with_suffix(".md"))
print(p.with_suffix(".md"))
実行結果:
data/report.md
with_suffix()で拡張子だけ差し替えられます。os版のos.path.splitext()より簡潔です。
ただし.tar.gzのような2重拡張子では、最後の1つだけが置き換わります。
from pathlib import Path
print(Path("archive.tar.gz").with_suffix(".zip"))
実行結果:
archive.tar.zip
名前だけ変える
from pathlib import Path
p = Path("data/old.txt")
print(p.with_name("new.txt"))
print(p.with_stem("renamed"))
実行結果:
data/new.txt
data/renamed.txt
| メソッド | 変えるもの |
|---|---|
with_name() |
ファイル名全体(拡張子込み) |
with_stem() |
拡張子を除いた名前だけ(Python 3.9以降) |
with_suffix() |
拡張子だけ |
フォルダ部分はそのまま保たれるため、パスを組み立て直す必要がありません。
連番リネームの実践例
from pathlib import Path
folder = Path("photos")
files = sorted(p for p in folder.glob("*.jpg") if p.is_file())
for i, p in enumerate(files, start=1):
p.rename(folder / f"photo_{i:03d}.jpg")
print(f"{p.name} → photo_{i:03d}.jpg")
実行結果(例):
a.jpg → photo_001.jpg
b.jpg → photo_002.jpg
ポイントは2つです。
sorted()で順序を固定する(glob()の並び順は保証されません)f"{i:03d}"でゼロ埋めする(001, 002…なら名前順が数値順と一致)
既にphoto_001.jpgがある場合、macOS / Linuxでは黙って上書きされます。安全にするなら、いったん一時的な名前に変えてから本来の名前にする二段階方式を取ってください。
別ドライブへは移動できない
from pathlib import Path
Path("C:/data/file.txt").rename("D:/backup/file.txt")
実行結果(例):
OSError: [Errno 18] Invalid cross-device link
名前の付け替えはディスク上のデータを動かさない操作なので、別のディスクにはまたがれません。
ドライブをまたぐ移動にはshutil.move()を使います。Pathオブジェクトをそのまま渡せます。
import shutil
from pathlib import Path
shutil.move(Path("C:/data/file.txt"), Path("D:/backup/file.txt"))
Path.rename()のまとめ
Path.rename()で名前の変更・移動ができる- 戻り値は新しい
Path。元のオブジェクトは変化しない - 移動先のフォルダは自動で作られない
- 上書き動作がOSで違う。統一したいなら
replace() - 拡張子は
with_suffix()、名前はwith_name()/with_stem() - 連番リネームは
sorted()とゼロ埋め、衝突に注意 - 別ドライブへは
shutil.move()




