見出し画像

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コードの流れ

    1. os.listdir() でフォルダ内のファイルを取得

    2. re.match() でファイル名を正規表現にマッチさせる

    3. os.rename() で新しいファイル名に変更

この方法を使えば、画像やドキュメントのファイル名を一括で統一できるだけでなく、ログの記録やファイル整理の自動化にも応用可能です。また、正規表現のパターンを変更することで、様々な命名規則のファイル名に対応できます。

Pythonの強みは、こうした柔軟な処理を簡単に追加できることです。ぜひ、自分の用途に合わせたカスタマイズを試してみてください!

いいなと思ったら応援しよう!