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()

あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら