Pythonでファイル名の前後に文字列や連番を加えて一括変更する方法

 

複数のファイル名を一括で変更したい場合、Pythonを使用すると効率的に処理できます。本記事では、ファイル名の前後に文字列を追加したり、連番を付けたりする方法を詳しく解説します。

基本的なファイル名変更

ファイル名の前に文字列を追加

import os
from pathlib import Path

# 現在のディレクトリ内の.txtファイルに"backup_"を前に付ける
path = Path(".")
for file in path.glob("*.txt"):
    new_name = file.parent / f"backup_{file.name}"
    file.rename(new_name)
    print(f"{file.name} → {new_name.name}")

ファイル名の後(拡張子前)に文字列を追加

from pathlib import Path

path = Path(".")
for file in path.glob("*.jpg"):
    stem = file.stem  # 拡張子なしのファイル名
    suffix = file.suffix  # 拡張子
    new_name = file.parent / f"{stem}_edited{suffix}"
    file.rename(new_name)
    print(f"{file.name} → {new_name.name}")

連番を付けたファイル名変更

ファイル名の前に連番を追加

from pathlib import Path

path = Path(".")
files = list(path.glob("*.png"))

for i, file in enumerate(files, 1):
    new_name = file.parent / f"{i:03d}_{file.name}"
    file.rename(new_name)
    print(f"{file.name} → {new_name.name}")

ファイル名を連番のみに変更

from pathlib import Path

path = Path(".")
files = sorted(path.glob("*.pdf"))  # ソートして順序を統一

for i, file in enumerate(files, 1):
    new_name = file.parent / f"document_{i:02d}{file.suffix}"
    file.rename(new_name)
    print(f"{file.name} → {new_name.name}")

実践的な一括変更例

日付を含むファイル名に変更

from pathlib import Path
from datetime import datetime

path = Path(".")
date_str = datetime.now().strftime("%Y%m%d")

for file in path.glob("*.log"):
    new_name = file.parent / f"{date_str}_{file.name}"
    file.rename(new_name)
    print(f"{file.name} → {new_name.name}")

特定の文字列を置換

from pathlib import Path

path = Path(".")
for file in path.glob("*temp*.txt"):
    new_name_str = file.name.replace("temp", "final")
    new_name = file.parent / new_name_str
    file.rename(new_name)
    print(f"{file.name} → {new_name.name}")

ファイルサイズを含むファイル名に変更

from pathlib import Path

path = Path(".")
for file in path.glob("*.mp4"):
    size_mb = file.stat().st_size / (1024 * 1024)
    stem = file.stem
    suffix = file.suffix
    new_name = file.parent / f"{stem}_{size_mb:.1f}MB{suffix}"
    file.rename(new_name)
    print(f"{file.name} → {new_name.name}")

安全なファイル名変更の実装

変更前に確認を求める機能

from pathlib import Path

def batch_rename_with_confirmation(pattern, prefix="", suffix=""):
    path = Path(".")
    files = list(path.glob(pattern))
    
    if not files:
        print("該当するファイルが見つかりません。")
        return
    
    print("以下のファイルが変更されます:")
    for i, file in enumerate(files, 1):
        stem = file.stem
        ext = file.suffix
        new_name = f"{prefix}{stem}{suffix}{ext}"
        print(f"{i}. {file.name} → {new_name}")
    
    confirm = input("\n実行しますか? (y/N): ")
    if confirm.lower() == 'y':
        for file in files:
            stem = file.stem
            ext = file.suffix
            new_name = file.parent / f"{prefix}{stem}{suffix}{ext}"
            file.rename(new_name)
        print("変更完了!")
    else:
        print("キャンセルしました。")

# 使用例
batch_rename_with_confirmation("*.txt", prefix="backup_", suffix="_v1")

重複ファイル名の回避

from pathlib import Path

def safe_rename(original_file, new_name_base):
    path = original_file.parent
    suffix = original_file.suffix
    new_name = path / f"{new_name_base}{suffix}"
    
    # 重複がある場合は連番を追加
    counter = 1
    while new_name.exists():
        new_name = path / f"{new_name_base}_{counter}{suffix}"
        counter += 1
    
    original_file.rename(new_name)
    return new_name

# 使用例
path = Path(".")
for i, file in enumerate(path.glob("*.jpg"), 1):
    new_file = safe_rename(file, f"image_{i:03d}")
    print(f"{file.name} → {new_file.name}")

エラーハンドリング付きの変更処理

from pathlib import Path
import shutil

def batch_rename_safe(pattern, prefix="", suffix=""):
    path = Path(".")
    files = list(path.glob(pattern))
    success_count = 0
    
    for file in files:
        try:
            stem = file.stem
            ext = file.suffix
            new_name = file.parent / f"{prefix}{stem}{suffix}{ext}"
            
            if new_name.exists():
                print(f"スキップ: {new_name.name} は既に存在します")
                continue
                
            file.rename(new_name)
            print(f"成功: {file.name} → {new_name.name}")
            success_count += 1
            
        except Exception as e:
            print(f"エラー: {file.name} - {e}")
    
    print(f"\n処理完了: {success_count}件のファイルを変更しました")

# 使用例
batch_rename_safe("*.txt", prefix="processed_")

まとめ

Pythonを使用したファイル名の一括変更は、手動では時間のかかる作業を効率化できる便利な機能です。pathlibモジュールを使用することで、より読みやすく安全なコードを書くことができます。実際の運用では、事前確認機能や重複回避機能、エラーハンドリングを組み込んで、安全にファイル名を変更することを心がけましょう。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座