akuruhinode's blog

pythonやC#を中心に興味を持った内容について調べています。

Python ファイル名の一括変換

はじめに

ここでは、任意のフォルダ内のファイル名を一括変換する方法を説明します。

バージョン情報

python: 3.7.9
pandas: 1.2.3

ソースコード

この処理にはいくつかの手順が必要なので、一連の処理を行う関数を作成しました。ソースコードと引数の説明は以下の通りです。

メインの処理

import os, glob, re, shutil
import pandas as pd

# フォルダ内のファイル名を一括変換する
def rename_files(path, rename_regex, replace_str='', check=True, rename=True):
 
    # 現在のファイル名のリストを取得
    old_file_list = glob.glob(path)
    # 変換後のファイル名のリストを作成
    new_file_list = list(map(lambda x: (re.sub(rename_regex, replace_str,
                    os.path.splitext(x)[0]) + os.path.splitext(x)[1]),
                    old_file_list))

    # 変換後のファイル名を確認する
    if check:
        df = pd.DataFrame(zip(old_file_list, new_file_list),
                          columns=['old_filename', 'new_filename'])
        print(df)
        df.to_csv('rename_list.csv', index=False, encoding='shift_jis')

    # 変換を行う
    if rename:
        # 念のため確認の入力を設ける
        if input('proceed?(y/n)') == 'y':
            for old_name, new_name in zip(old_file_list, new_file_list):
                shutil.move(old_name, new_name)

使用例

# ファイル名を一括変換
rename_files(path=r'C:\example\*.txt', rename_regex='\-1$')

引数

  • path:フォルダパス
  • rename_regex:変換する文字列(正規表現
  • replace_str:変換後の文字列(デフォルトでは空文字)
  • check:変換後の文字列をCSVに出力する
  • rename:変換を実施する

補足

この例では、C:\example以下のすべてのテキストファイルについて、ファイル名の末尾から'-1'という文字列を削除しています。rename_regexreplace_strを任意の値に変更することで、様々な変換を実現可能です。

変換前 変換後
aaa-1.txt aaa.txt
bbb-1.txt bbb.txt

pathにて以下のようにすれば、すべての拡張子のファイルに対して変換を行うことができます。

# ファイル名を一括変換
rename_files(path=r'C:\example\*.*', rename_regex='\-1$')

なお、上記関数はファイルの拡張子は変換対象外としています。

注意点

フォルダのパスや正規表現を間違えると、想定外の変換が行われてしまう可能性があります。
それを防ぐためにここでは2つの引数を追加しています。

checkでTrueを指定すると、変換結果例をCSVに出力します(コマンドライン上にも表示しますが、ファイル数やファイル名が長いと確認し難いことが想定されますのでCSVでの確認を推奨します)。
renameではTrueを指定した場合のみ、変換を実施します。そのため、まずはcheck=Truerename=Falseで変換結果を事前に確認したうえで、実際の変換を行うと安心です。


さらに、rename=Trueとした場合でも、変換前に以下の確認文字列が表示されます。ここで、'y'以外を入力すると、変換を実施しません。

proceed?(y/n)