Top >>

最終更新日: 2011年10月15日 18:13

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 ###"