スクリーンショットフォルダの一括リネームをPythonで。

昔からスクリーンショットを残しておくのが好きで、今まで5000枚ほどの画像がたまっている。
それで1年前の今日はこんなことしてたな〜なんて懐古するのが楽しい。

しかし1年前の今日という検索をするにはファイルの更新日時をしっかり残していないとだめだ。
画像のサイズを下げるために一括最適化をかけたりしたら、更新日時が全て上書きされてしまう・・なんてことも実際にあった。

ファイル名を更新日時にすればいい!

この方法を思いついた。これなら、更新日時が書き換わってしまっても、いつ撮ったものなのかすぐに分かる。
その上ファイル名なら、Everythingなどの高速検索ソフトで簡単に取り出せる。

まさか、5000枚余りの画像の名前変更を手動で?

そんなことできるわけないので、こういう繰り返し作業に強いプログラムにやってもらうことに。

次に何の言語を使おうということになる

自分はPHPActionScriptぐらいしかできない。この2つはファイル操作があまり楽ではない。
そこで調べてみるとPythonというのが楽らしい!

Pythonで実際に書いた結果

やはり初めてのコードというのはぐちゃぐちゃになりがちだが、なんとか動いた。
python.exe rename.py C:\ss\ という風に使うと、C:\ss\以下のサブフォルダも含む全てのpng, bmp, jpgファイルが
2010_07_11_23_16_46.png(その画像の更新日時)といった名前に変わる。

import os, sys, time
# config ========================================================================================
class Config:
    exts = [".png", ".bmp", ".jpg"]
# def ========================================================================================
def getmtime(path): return(time.localtime(os.path.getmtime(path)))

def rename(dir):
    for root, dirs, files in os.walk(dir):
        cnt = 2
        print("----%s----" %root)
        for i in files:
            path = os.path.join(root,i)
            ext = os.path.splitext(path)[1]
            if (ext.lower() in Config.exts) == False: continue
            t = getmtime(path)
            result = "%04d_%02d_%02d_%02d_%02d_%02d" %(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)
            if i == result+ext: print(i+" <<<skip>>>"); continue
            if os.path.exists(root+result+ext): result += "(%d)" %cnt; cnt += 1
            if root[-1] != "\\": root += "\\"
            print(i+" -> "+result+ext)
            try:
                os.rename(path, root+result+ext)
            except:
                print("Rename Error!!("+path+" -> "+root+result+ext+")")
            else:
                global successCount
                successCount += 1;
# main ========================================================================================
successCount = 0
targetDir = sys.argv[1]
if os.path.isdir(targetDir) == False: print(targetDir + " is invalid dir path"); sys.exit()
if targetDir[-1] != "\\": targetDir += "\\"
rename(targetDir)
print(str(successCount)+" file(s) are succeed!")

Python面白いのでまた今度他のスクリプトも作りたいと思った。