Exif情報でのjpegリネーム(Windows, Python)
手頃なリネームソフトが無かったのでPythonで自作しました。
オリジナルファイル名の先頭にyyMMddを付けたかっただけなので、
インストールしていたPython2.7と、Exifライブラリを使用しました。
http://sourceforge.net/projects/exif-py/
Windows7なので「C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\SendTo」に「EXIF_Rename.py」を作成。
コマンドライン引数を受け取るようにスクリプトを書きます。
(2011/10/15追記:SVNにあげておきました。http://svn.htlab.net/Exif_Rename/ )
#! C:/Python27/python.exe
# -*- coding: utf-8 -*-
import sys, os, EXIF
argvs = len(sys.argv)
print "### EXIF Rename Script ###"
print str(argvs-1)+" Files Rename Start"
for i in range(1, argvs): #引数の数だけループ
fpath = sys.argv[i] #フルパス
fname = fpath.split('\\')[-1] #ファイル/ディレクトリ名
fdir = fpath[0:fpath.rindex("\\")] #ファイルディレクトリ
if os.path.isfile(fpath): #ファイルの場合
print(" -> ("+str(i)+"/"+str(argvs-1)+") FileName: "+fname),
if fname[-3:].lower() == "jpg" or fname[-3:].lower() == "cr2":
print(" jpg/cr2 file Match"),
exif = str(EXIF.process_file(open(fpath, 'rb'))['EXIF DateTimeOriginal'])
year = exif.split()[0].split(":")[0]
mon = exif.split()[0].split(":")[1]
day = exif.split()[0].split(":")[2]
#hour = exif.split()[1].split(":")[0]
#min = exif.split()[1].split(":")[1]
#sec = exif.split()[1].split(":")[2]
if fname[0:6] == year[2:]+mon+day:
os.rename(fpath, fdir+"\\"+fname[7:])
print(" ... Fixed")
else:
os.rename(fpath, fdir+"\\"+year[2:]+mon+day+"_"+fname)
print(" ... Renamed")
else:
print(" not jpg/cr2 file")
elif os.path.isdir(fpath): #フォルダの場合
count = 0
all = 0
for root, dirs, files in os.walk(fpath):
for file_ in files:
all += 1
for root, dirs, files in os.walk(fpath):
for file_ in files:
full_path = os.path.join(root, file_) #フルパス
fname = full_path.split('\\')[-1] #ファイル/ディレクトリ名
fdir = full_path[0:full_path.rindex("\\")] #ファイルディレクトリ
count +=1
print(" -> ("+str(count)+"/"+str(all)+") FileName: "+fname),
if fname[-3:].lower() == "jpg" or fname[-3:].lower() == "cr2":
print(" jpg/cr2 file Match"),
exif = str(EXIF.process_file(open(full_path, 'rb'))['EXIF DateTimeOriginal'])
year = exif.split()[0].split(":")[0]
mon = exif.split()[0].split(":")[1]
day = exif.split()[0].split(":")[2]
#hour = exif.split()[1].split(":")[0]
#min = exif.split()[1].split(":")[1]
#sec = exif.split()[1].split(":")[2]
if fname[0:6] == year[2:]+mon+day:
os.rename(full_path, fdir+"\\"+fname[7:])
print(" ... Fixed")
else:
os.rename(full_path, fdir+"\\"+year[2:]+mon+day+"_"+fname)
print(" ... Renamed")
else:
print(" not jpg/cr2 file")
print "### E N D ###"
フォルダの対応などは後から付けた感が漂っていますが気にせず。
とりあえず動きますが、暇な人はもうちょっとスマートにしてみるといいかもです。
ファイルを選択した状態で右クリック、送るメニューから「EXIF_Rename.py」を選択するとコマンドラインが開き処理開始です。
処理が終わると自動的に閉じます。
追記
ファイル名が重複しているときに、エクスプローラーがつけるファイル名、
「オリジナルファイル名+半角スペース+”(2)”」を削除するスクリプト。
#! C:/Python27/python.exe
# -*- coding: utf-8 -*-
import sys, os
argvs = len(sys.argv)
print "### (2) Delete Script ###"
print str(argvs-1)+" Files Rename Start"
for i in range(1, argvs): #引数の数だけループ
fpath = sys.argv[i] #フルパス
fname = fpath.split('\\')[-1] #ファイル/ディレクトリ名
fdir = fpath[0:fpath.rindex("\\")] #ファイルディレクトリ
if os.path.isfile(fpath): #ファイルの場合
print(" -> ("+str(i)+"/"+str(argvs-1)+") FileName: "+fname),
if fname[-7:-4].lower() == "(2)":
print(" (2) file Match"),
os.rename(fpath, fdir+"\\"+fname[0:-8]+fname[-4:])
print(" ... Fixed")
else:
print(" not (2) file")
elif os.path.isdir(fpath): #フォルダの場合
count = 0
all = 0
for root, dirs, files in os.walk(fpath):
for file_ in files:
all += 1
for root, dirs, files in os.walk(fpath):
for file_ in files:
full_path = os.path.join(root, file_) #フルパス
fname = full_path.split('\\')[-1] #ファイル/ディレクトリ名
fdir = full_path[0:full_path.rindex("\\")] #ファイルディレクトリ
count +=1
print(" -> ("+str(count)+"/"+str(all)+") FileName: "+fname),
if fname[-7:-4].lower() == "(2)":
print(" (2) file Match"),
os.rename(full_path, fdir+"\\"+fname[0:-8]+fname[-4:])
print(" ... Fixed")
else:
print(" not (2) file")
print "### E N D ###"


