【Python】ファイル名を一括置換させるPythonコード

本ブログはアフィリエイト広告を利用しています

WEB / アプリ
WEB / アプリ
この記事は約7分で読めます。

とっちゃん@nyanco! です。

今回は特定の文字を含むファイル名を任意の文字に一括でリネームさせるPythonコードを作成したので共有するよというお話です。

肉玉にゃんこ

コードはChatGPTで作成したものを少しカスタマイズしてますにゃ~
さくさくコードを作れるのはChatGPT様々ですにゃ~

スポンサーリンク

コードの動作環境

  • OS:Windowsで動作確認 ※macOSでは未確認
  • Pythonバージョン:3.11.2
  • 必要ライブラリ:標準ライブラリでOK

コード作成のきっかけ

このコードを作ったきっかけはズバリこちら。

業務で先方からの支給データのファイル名にやたらと特殊文字の丸数字が使われててそのまま使うと色々と不都合(文字化けなど)があり、手作業でリネームするのが面倒だから!

▼こういう丸数字が使われたファイル名ですね。

肉玉にゃんこ

仕事あるあるですにゃ~
リネームソフトを使ったらできますがやや面倒ですにゃ~

なので、サンプルコードは下記のように丸数字を半角数字に変換するという設定になってますが、もちろん任意の文字にカスタム可能です。

# 置換前の文字列のリスト
old_str_list = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨']
# 置換後の文字列のリスト
new_str_list = ['1_', '2_', '3_', '4_', '5_', '6_', '7_', '8_', '9_']
肉玉にゃんこ

「①」を「1_」に、「②」を「2_」にという感じで一気に置換しますにゃ~
アンダーバーは次に数字が続いても見やすくするための区切りですにゃ~

▼使用イメージはこちら。

肉玉にゃんこ

何が起こったのか気付かないくらいまさに一瞬!ですにゃ~

上記は実行する.pyファイルがある同じディレクトリ(フォルダ)内のフォルダ・ファイルを対象とするコードを実行しています。

特定の文字を任意の文字に一括置換させるPythonコード

リネームする対象違いで3種類コードを用意しました。

  • .pyファイルのある同じフォルダ内のファイル・フォルダが対象
  • ドラッグ&ドロップしたファイル・フォルダが対象
  • 任意のフォルダ内にあるファイル・フォルダが対象

いずれもサブフォルダは対象外となります。

肉玉にゃんこ

色んなシーンで使いわけができますにゃ~
すぐに使えるように.pyファイルもダウンロードもできますにゃ~

.pyファイルのあるフォルダ対象コード

import os
import re

# 置換前の文字列のリスト
old_str_list = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨']
# 置換後の文字列のリスト
new_str_list = ['1_', '2_', '3_', '4_', '5_', '6_', '7_', '8_', '9_']

# スクリプトのパスを取得する
script_path = os.path.abspath(__file__)

# スクリプトと同じディレクトリにあるファイルのリストを取得する
dir_path = os.path.dirname(script_path)
file_list = os.listdir(dir_path)

# 各ファイルに対して置換を行う
for file_name in file_list:
    # ファイル名に対して置換を行う
    new_file_name = file_name
    for old_str, new_str in zip(old_str_list, new_str_list):
        new_file_name = new_file_name.replace(old_str, new_str)
    old_file_path = os.path.join(dir_path, file_name)
    new_file_path = os.path.join(dir_path, new_file_name)
    if old_file_path != new_file_path:
        os.rename(old_file_path, new_file_path)

→rename_cd.zipをダウンロードする

肉玉にゃんこ

ファイル名の「cd」とはカレントディレクトリ(現在のフォルダ)の意味ですにゃ~

ドラッグ&ドロップ対象コード

import os
import sys
import re

# 置換前の文字列のリスト
old_str_list = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨']
# 置換後の文字列のリスト
new_str_list = ['1_', '2_', '3_', '4_', '5_', '6_', '7_', '8_', '9_']

# ドラッグ&ドロップされたファイルのパスを取得する
file_paths = sys.argv[1:]

for file_path in file_paths:
    # ファイル名に対して置換を行う
    dir_path = os.path.dirname(file_path)
    file_name = os.path.basename(file_path)
    new_file_name = file_name
    for old_str, new_str in zip(old_str_list, new_str_list):
        new_file_name = new_file_name.replace(old_str, new_str)
    old_file_path = file_path
    new_file_path = os.path.join(dir_path, new_file_name)
    if old_file_path != new_file_path:
        os.rename(old_file_path, new_file_path)

→rename_D&D.zipをダウンロードする

任意のフォルダ対象コード

import os
import re

# 置換前の文字列のリスト
old_str_list = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨']
# 置換後の文字列のリスト
new_str_list = ['1_', '2_', '3_', '4_', '5_', '6_', '7_', '8_', '9_']

# 置換を行うフォルダのパス(相対パスでも絶対パスでもOK)
folder_path = 'C:/Users/ユーザー名/Desktop'

# フォルダ内のすべてのファイルとフォルダのリストを取得する
for root, dirs, files in os.walk(folder_path):
    for file in files:
        # ファイル名に対して置換を行う
        old_file_path = os.path.join(root, file)
        new_file_path = old_file_path
        for i, old_str in enumerate(old_str_list):
            new_str = new_str_list[i]
            new_file_path = new_file_path.replace(old_str, new_str)
        if old_file_path != new_file_path:
            os.rename(old_file_path, new_file_path)
        
    for dir in dirs:
        # フォルダ名に対して置換を行う
        old_dir_path = os.path.join(root, dir)
        new_dir_path = old_dir_path
        for i, old_str in enumerate(old_str_list):
            new_str = new_str_list[i]
            new_dir_path = new_dir_path.replace(old_str, new_str)
        if old_dir_path != new_dir_path:
            os.rename(old_dir_path, new_dir_path)

→rename_folder.zipをダウンロードする

肉玉にゃんこ

10行目の「folder_path=」の後ろに任意のフォルダパスを設定してお使いくださいにゃ~
相対パスでも絶対パスでもどちらでもOKですにゃ~

おわりに

肉玉にゃんこ

良く使う置換設定を複数の.pyファイルに分けておくと超絶便利ですにゃ~

本記事がどなたかの参考になれば幸いです。

今回は以上となります。
最後まで読んでいただきましてありがとうございました!
それではまた〜✧٩(ˊωˋ*)و✧

コメント