
PYTHONの正規表現でファイルの一括リネーム
正規表現について、理解が深まったでしょうか?
実際にどんな時に使えるかコードを交えながら学びましょう。
今回は、ファイルのリネームです。
便利なリネームツールも存在しますが、
いろんな処理を柔軟に付け加えたりできるのがPythonの強みです。
例えば、ログを取ったりいらないものを捨てたり
ファイルの作成日によって処理を変えたり
必要に応じて色々なことが出来ます。
ファイルの一括リネーム
ある規則に従ったファイル名を
別の形式にしたいとか
ファイル名の形式が混じってしまったので
統一したいっていう事は結構ありますよね。
そんなときの使い方を学びましょう。
IMG_20240201_1234.jpg → 20240201-1234.jpg
たとえば、"IMG_20240201_1234.jpg" のような画像ファイルを、"20240201-1234.jpg" に統一する例を考えます。
元の名前の規則は、
"IMG_"+西暦+月日+"_連番".jpg です。
これを
西暦+月日+"-連番".jpg に変更します。
正規表現
このルールに従ったファイル名を一括でリネームするために、正規表現 IMG_(\d{8})_(\d+)\.jpg を使用します。
(\d{8})
これは、最初の西暦と月日(YYYYMMDD)を表します。
\d は、数字を表し {8} は、それを8回繰り返すことを表します。
そして、それが () で括られたのでキャプチャグループになります。
最初のグループなので、第一キャプチャグループです。
(\d+)
これは、画像ファイルに付けられた連番部分(例: 1234)を表します。
\d は、数字を表し + は、1回以上の繰り返しを表します。
そして2番目に () でくくられたので第二キャプチャグループになります。
以下のコードでファイル名を変換できます。
import os
import re
# 変更したいファイルがあるフォルダのパスを指定
folder_path = r"C:\path\to\your\folder" # フォルダのパスを指定
# 正規表現のパターン
pattern = re.compile(r'IMG_(\d{8})_(\d+)\.jpg')
# フォルダ内のファイルを取得
for filename in os.listdir(folder_path):
match = pattern.match(filename) # パターンにマッチするか確認
if match:
new_filename = f"{match.group(1)}-{match.group(2)}.jpg" # 置換後のファイル名
old_path = os.path.join(folder_path, filename)
new_path = os.path.join(folder_path, new_filename)
# ファイル名を変更
os.rename(old_path, new_path)
print(f"Renamed: {filename} → {new_filename}")
print("リネーム完了!")
コード解説
pattern = re.compile(r'IMG_(\d{8})_(\d+)\.jpg')
match = pattern.match(filename)
このコードで match には、マッチオブジェクトが入ります。
for filename in os.listdir(folder_path):
os.listdir(folder_path) で
フォルダ名 folder_path にあるファイル名のリストが得られます。
for … in … : 構文で
filename には、ファイル名一つ分が入ります。
if match:
new_filename = f"{match.group(1)}-{match.group(2)}.jpg" # 置換後のファイル名
old_path = os.path.join(folder_path, filename)
new_path = os.path.join(folder_path, new_filename)
# ファイル名を変更
os.rename(old_path, new_path)
match が None でない場合(つまり、正規表現にマッチした場合)、以下の処理を行います。
new_filename(新しいファイル名) は、
match.group(1) つまり 西暦+月日
match.group(2) つまり 連番
を "-" で連結して ".jpg" を付けたものになります。
new_path = os.path.join(folder_path, new_filename)
フォルダパスと新しいファイル名から
新しいファイルのパスを合成します。
os.rename(old_path, new_path)
ファイル名を新しいファイル名で書き換えました。
正規表現のパターンを変更すれば、異なる形式のファイル名にも対応できます。
まとめ
この記事では、Pythonの正規表現を活用してファイル名の一括リネームを行う方法を紹介しました。特定のパターン(IMG_YYYYMMDD_連番.jpg)のファイル名を、より統一された形式(YYYYMMDD-連番.jpg)に変換するコードを解説しました。
正規表現の基本
(\d{8}) → 西暦+月日(YYYYMMDD)を抽出
(\d+) → 連番部分を抽出
Pythonコードの流れ
os.listdir() でフォルダ内のファイルを取得
re.match() でファイル名を正規表現にマッチさせる
os.rename() で新しいファイル名に変更
この方法を使えば、画像やドキュメントのファイル名を一括で統一できるだけでなく、ログの記録やファイル整理の自動化にも応用可能です。また、正規表現のパターンを変更することで、様々な命名規則のファイル名に対応できます。
Pythonの強みは、こうした柔軟な処理を簡単に追加できることです。ぜひ、自分の用途に合わせたカスタマイズを試してみてください!