前回、大量の画像ファイルに意味のある名前を付けて連番リネームを行うプログラムを作ってみた。とは言え、せっかくオリジナルのリネームツールを作るのなら、より自分の業務にフィットした独自の機能を付け加えたいと思うだろう。今回は、ファイルの日付やファイルの内容に応じて、自動でファイル名をつけるプログラムを作ってみよう。 author=クジラ飛行机

ファイルの更新日時を連番に加える

前回、基本的なファイルの連続リネームの方法を紹介した。そこで、前回のプログラムを改良して、ファイルの更新日時をファイル名に含めるプログラムを作ってみよう。各ファイルには、ファイルのデータそのものに加えて、作成日時、更新日時などの付加情報が記録されている。自動リネームで、これを利用しない手はない。

ここでは、写真の整理を目的にして、「(更新日付)-(撮影場所)-(連番).jpg」のような形にファイル名を変更してみよう。とは言え、撮影場所を取得するプログラムは複雑になってしまうので、撮影場所の情報だけは手入力するものとしよう。

import glob, os, time
# ファイルの一覧を列挙 --- (*1)
files = glob.glob("*.jpg")
# 繰り返しリネームする --- (*2)
for i, old_name in enumerate(files):
    # ファイルの更新日時を得る --- (*3)
    t = os.path.getmtime(old_name)
    ts = time.strftime("%Y%m%d", time.localtime(t))
    # ファイル名を決定して改名 --- (*4)
    new_name = "{0:s}-横浜-{1:03d}.jpg".format(ts, i + 1)
    os.rename(old_name, new_name)
    print(old_name + "→" + new_name)

上記のプログラムを「rename_date.py」という名前で保存し、コマンドラインから、以下のように実行すると、ファイル名が一気に変更される。なお、macOS/Linuxでは、pythonをpython3に変更して実行してみよう。

python rename_date.py

プログラムを実行すると、以下のようにファイル名が変更される。

  • ファイル名に日付が設定されたところ

    ファイル名に日付が設定されたところ

プログラムを見てみよう。(*1)の部分では、ファイルの一覧を列挙する。ここでは、カレントディレクトリにある拡張子が".jpg"のファイル全てを列挙している。(*2)の部分では、列挙したファイル一覧を繰り返し処理するようにfor構文を記述している。(*3)の部分では、ファイルの更新日時を得る。更新日時を得るには、os.path.getmtime()を利用する。そして、(*4)の部分では、新しいファイルの名前を決定し、実際にリネームする。

ちなみに、ファイルの作成日時ではなく更新日時を利用しているのには理由がある。ファイルの作成日時は、そのファイルが作成された日時だ。そのため、写真を撮影した時点で、作成日時と更新日時は全く同じ日時となる。しかし、ファイルをPCにコピーした場合、ファイルの作成日時は、ファイルをコピーした日時となる。つまり、PCにコピーした時点で、ファイルの作成日時と撮影日時は異なるものとなってしまう。そこで、更新日時を利用すれば、実際の写真撮影日時となる可能性が高い。

なお、更新日時ではなく、敢えて作成日時を使いたい場合もあるだろう。以下にファイルの付加情報を得る関数をまとめておく。

関数名 意味
os.path.getctime() ファイルの作成日時
os.path.getmtime() ファイルの更新日時
os.path.getatime() ファイルへのアクセス日時
os.path.getsize() ファイルのサイズ

Wordファイルの内容を確認してリネームしてみよう

次にファイルの内容を確認してリネームする方法を考えてみよう。ファイルの内容を確認するためには、そのファイルを開いて、実際にそのファイルがどんなフォーマットであるのかを調べる必要がある。現実的に、すべてのファイル形式に対応することは難しいだろう。

そこで、今回は、Wordファイルを対象に、Wordの冒頭の一行を取り出して、ファイル名にしてみよう。つまり、『(冒頭一行)-(更新日時)-(連番).docx』という形式にリネームしてみよう。

ここでWordファイルを操作するために、「python-docx」というライブラリを利用してみよう。このライブラリを利用すると、Wordがインストールされてなくても、Wordファイルを操作できるようになる。コマンドラインから、以下のpipコマンドを実行すると、ライブラリをインストールできる。

# Windows/ Anacondaをインストールした場合
pip install python-docx

# macOS / Linuxの場合
pip3 install python-docx

そして、以下のプログラムを「rename_word.py」という名前で保存しよう。

import glob, os, time, re
from docx import Document

files = glob.glob("*.docx")
for i, old_name in enumerate(files):
    # ファイルの作成日時を得る
    t = os.path.getmtime(old_name)
    ts = time.strftime("%Y%m%d", time.localtime(t))
    # Wordの一行目を得る
    title = '不明'
    try:
        doc = Document(old_name)
        title = doc.paragraphs[0].text
        title = re.sub(r'(\r|\n|\t|\s|\\|\/|\:|\;|\"|)', '', title)
    except:
        pass
    # ファイル名を決定して改名
    new_name = "{0}-{1}-{2:03d}.docx".format(title, ts, i + 1)
    try:
      os.rename(old_name, new_name)
      print(old_name + "→" + new_name)
    except:
      print("ERROR: " + old_name + "→" + new_name)

コマンドラインからプログラムを実行してみよう。(macOS/Linuxの場合は、pythonをpython3に置き換えよう。)

python rename_word.py

実行すると、次のようにWordファイルにタイトルが設定される。

  • ファイル名に日付が設定されたところ

    ファイル名に日付が設定されたところ

プログラムを確認してみよう。プログラムの(*1)の部分では、先ほどと同じようにファイルの更新日時を得る。そして、(*2)の部分で、Wordファイルを開き、そこに記述されている内容を取得する。この時、先頭のパラグラフに書かれているテキストだけを得るには「doc.paragraphs[0].text」のように記述する。そして、(*3)の部分でファイル名をリネームする。

Pythonには、Wordの他にも、Excelやその他の形式のファイルを手軽に読み込むライブラリが豊富にあるので、そうしたライブラリを使えば、より賢くリネームするツールを作ることができるだろう。

まとめ

以上、今回は、前回の連番リネームのプログラムを改良して、より自分の要望に添ったリネームを行うプログラムを紹介した。そもそも、ファイルにどのような名前を付けるのかは、その人の個性や好みが反映される部分ではあるが、業務においては、「名は体を表す」の状態にしておくのが良い。短いながら、ファイルの内容が明確に分かるファイル名が付されていれば、業務の効率化につながるだろう。本稿を参考に、オリジナルのリネームツールを作り、業務改善に利用してみよう。

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