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$')
引数
補足
この例では、C:\example
以下のすべてのテキストファイルについて、ファイル名の末尾から'-1'
という文字列を削除しています。rename_regex
やreplace_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=True
、rename=False
で変換結果を事前に確認したうえで、実際の変換を行うと安心です。
さらに、rename=True
とした場合でも、変換前に以下の確認文字列が表示されます。ここで、'y'
以外を入力すると、変換を実施しません。
proceed?(y/n)