デジカメで撮影した画像ファイル名を YYMMDD_HHMMSS.jpg みたいな日付時刻文字列に変換する

デジカメで撮った画像をどうやって整理しようかと考えて、ファイル名先頭に日付時刻文字列を付ければ時系列で並ぶから扱いやすいかなと思って運用してみた。良い感じなので継続。

やり方としては、Python で書いた。デジカメ画像ファイルは、ファイルの最終修正時間=撮影した日付、とみなせる(と思う)ので、各ファイルから最終修正時間さえ取り出さればいい。os.stat(ファイルパス).st_mtime で取れる。

使い方

  • デジカメ画像が放り込まれてるフォルダに cd する
  • 下記スクリプトを python XXXXX.py と実行する(XXXXXはスクリプト名)

スクリプト(Python2)

  • カレントディレクトリに存在する jpg or png をターゲットにする
  • このターゲット達のファイル名を本当に変えますか?と確認して、y を入力したら実行する感じ
# -*- coding: utf-8 -*-

import datetime
import os
import sys

def abort(msg):
    print msg
    exit(1)

def get_directory(path):
    return os.path.dirname(path)

def get_filename(path):
    return os.path.basename(path)

def get_basename(path):
    return os.path.splitext(get_filename(path))[0]

def get_extension(path):
    return os.path.splitext(get_filename(path))[1]

def filepath_to_datetimestr(filepath):
    timestamp = os.stat(filepath).st_mtime
    dt = datetime.datetime.fromtimestamp(timestamp)
    return dt.strftime('%y%m%d_%H%M%S')

curdir = os.getcwd()
filenames = os.listdir(curdir)
valid_exts = ['.jpg', '.png']
filenames = [fn for fn in filenames if get_extension(fn.lower()) in valid_exts]
filecount = len(filenames)

if filecount==0:
    abort('No image files.')

def image_to_dt(curdir, filenames, enable=False):
    for i in range(filecount):
        filename = filenames[i]

        fullpath = os.path.join(curdir, filename)
        datetimestr = filepath_to_datetimestr(fullpath)

        # 秒単位でファイル名にしてるから被ることはないやろ.
        # (1秒に2枚以上撮るとか連射しない限りは無理なはず)
        # ... というわけで既存なら連番増やす, なんて対応はしない.
        before_name = filename
        after_name = '%s%s' % (datetimestr, get_extension(filename))

        if enable:
            old = fullpath
            new = os.path.join(curdir, after_name)
            os.rename(old, new)
        else:
            print '%s -> %s' % (before_name, after_name)

image_to_dt(curdir, filenames, enable=False)
print '%d items, do rename?' %filecount
print '>',
try:
    res = raw_input()
except EOFError:
    res = None

if not res in ['y', 'yes']:
    abort('Canceled.')

image_to_dt(curdir, filenames, enable=True)
print 'fin.'