趣味や業務で大量のファイルを扱う場面というのは多い 。その際、あまりにも大量のファイルがあると、一つ一つ名前を付けることは物理的に不可能だ。しかし、それら大量のファイルに対して、何かしら意味のある名前をつけておきたい。そんなときに採用するのが、連番のついたファイル名だ。Pythonを使えば、連番リネームも簡単だ。今回は、ファイルを連番リネームする方法紹介しよう。

  • ファイル名を美しい連番付きにリネームしよう

    ファイル名を美しい連番付きにリネームしよう

連番リネームとは何か?

大量のファイルに対して、001.txt, 002.txt, 003.txt ... と連番のついたファイル名をつけることを連番リネームと呼ぶ。ただし、単に数字の連番だけでは、ファイル名に意味を付することにはならない。そこで、意味のある単位ごとに、「資料A-001.docx」「資料A-002.docx」「資料A-003.docx」...のように、『意味のある名前+連番』の形式でファイル名を変更すると便利だ。連番を先頭ではなく末尾におくと、フォルダ内に別のファイルがあっても、名前順で並べ替えたときに、意味のあるまとまりごとに並んでくれる。

これをPythonで実現するのはそれほど難しいことではない。基本的なやり方としては、任意のディレクトリやパスに対して、globで対象ファイルを列挙して、その各ファイルの一つずつを連番ファイル名にリネームすれば良い。

連番リネームの基本プログラム

最初に、Pythonで基本的な連番リネームの方法を確認してみよう。大量のJPEG画像ファイルに対して、001.jpg, 002.jpg, 003.jpg ... と連番に改名するプログラムを以下に示す。(なお、このプログラムは、リネームの仕組みが分かりやすくなるようにわざと冗長に記述している。)

# 連番リネーム
import glob, os # --- (*1)
# ファイル列挙 --- (*2)
files = glob.glob("*.jpg")
# 繰り返しリネーム --- (*3)
i = 1
for old_name in files:
    # 数値を三桁(001)形式にそろえる --- (*4)
    zero_i = "{0:03d}".format(i)
    # ファイル名を作る
    new_name = zero_i + ".jpg"
    # 改名する --- (*5)
    os.rename(old_name, new_name)
    # 状況を報告
    print(old_name + "→" + new_name)
    # 連番のため数値を加算 --- (*6)
    i += 1

上記のプログラムを「rename.py」という名前で保存し、JPEGファイル(拡張子が".jpg"のもの)がたくさんあるフォルダにコピーしよう。

プログラムを実行するには、以下のように記述する。macOSやLinuxの場合、以下のpythonコマンドをpython3コマンドに置き換えて実行しよう。

python rename.py

実行すると、次の画面のように、ファイル名に対して、数字の連番が振られる。

  • ファイル名が連番に変更されたところ

    ファイル名が連番に変更されたところ

それでは、プログラムを確認してみよう。(*1)の部分では、プログラム中で必要となるライブラリの取り込みを行う。globはファイル一覧を列挙するため、osはその名の通り、OSの各種機能を利用するためのもので、今回はファイル名を変更するために利用する。(*2)の部分は、カレントディレクトリにあり、拡張子が".jpg"のファイル一覧を列挙する。そして、(*3)の部分では、列挙したファイル一覧を一つずつ繰り返し処理する。(*4)の部分では、数値をゼロで埋めて、001、002、003...のような形式にして、新しいファイル名を決める。そのために、formatメソッドを使う。formatを使うと、文字列中に数値を埋め込んだり、数値の形式を指定できる。

そして、(*5)の部分では、『os.rename(旧ファイル名, 新ファイル名)』の書式で実際にファイル名を変更する。最後に、(*6)の部分では、数値を連番にするために、変数iの値を一つずつ加算する。

意味を付して連番リネームしよう

上記のプログラムの流れが確認できたら、もう少し、Pythonらしくプログラムを書き換えてみよう。プログラムの動作は全く同じだ。Pythonの機能を使うと、とても完結にプログラムを記述できる。

import glob, os
files = glob.glob("*.jpg")
for i, old_name in enumerate(files): # --- (*1)
    # ファイル名を決定する --- (*2)
    new_name = "{0:03d}.jpg".format(i + 1)
    # 改名する
    os.rename(old_name, new_name)
    # 状況を報告
    print(old_name + "→" + new_name)

前回のプログラムと違うのは、(*1)の部分で、enumerate()を使っていることだ。このように記述すると、自動で繰り返し回数(値は0から始まる)を得られる。また、(*2)の部分では、ファイル名の書式をそのままformat()の書式に書き込んでいる。

例えば、あるフォルダの中に、渋谷のカフェで撮影した大量の画像があり、そのファイルに連番を付けたいとする。その場合、上記の(*2)の部分を以下のように書き換えると、『渋谷スイーツ-(連番).jpg』の形式に連番リネームできる。

    # ファイル名を決定する --- (*2)
    new_name = "渋谷スイーツ-{0:03d}.jpg".format(i + 1)

書き換えたプログラムを「rename2.py」という名前で保存したら、以下のようにしてプログラムを実行しよう。同様に、macOSやLinuxでは、pythonの部分をpython3に書き換えよう。

python rename2.py

実行すると、以下のようになる。

  • ファイル名が美しく整形されたところ

    ファイル名が美しく整形されたところ

まとめ

以上、ここまで連番リネームを行うPytyonのプログラムを紹介した。Pythonで一括ファイル処理を行う基本的な方法が理解できたことと思う。しかし、今回紹介した基本的な連番リネームを行うだけならば、わざわざ自作のプログラムを作るまでもなく、既存のツールがある。そこで、次回、ファイルの作成日時を利用したり、ファイルの内容を確認してリネームするオリジナルなツールを作ってみよう。お楽しみに。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。