[M1 Mac, Big Sur 11.6.5, Python 3.10.0]
前のブログサイトからの引っ越しです。画像ファイルをSDカードから外部SSDへ日付振り分けしてコピーします。
Nikon Trasnferという配布アプリで日付振り分けができることを知らずにコードを書きました。今も愛用しています。
# coding: UTF-8
import shutil ,os ,glob
from PIL import Image, ExifTags
import collections
path_list = glob.glob('/NIKON D500 /DCIM/101ND500/*.JPG')
exif_datetime_list = []
for path in path_list:
img = Image.open(path)
exif = { ExifTags.TAGS[k]: v for k, v in img._getexif().items() if k in ExifTags.TAGS }
# print(exif)
exif_datetime = [v for k, v in exif.items() if k == "DateTimeOriginal"]
print(exif_datetime[0])
exif_datetime_str = (exif_datetime[0].split(':')[0])[2:4] + exif_datetime[0].split(':')[1] + (exif_datetime[0].split(':')[2])[0:2]
print(exif_datetime_str)
exif_datetime_list.append(exif_datetime_str)
print(exif_datetime_list)
# 作成日の内訳を集計し作成日のリストを作成する
keys = collections.Counter(exif_datetime_list).keys()
print(keys)
# 作成日フォルダを作成する
for key in keys:
try:
os.mkdir('/photo/D500/' + str(key))
except FileExistsError:
pass
# 画像ファイルを各フォルダにコピーする
for path in path_list:
# 画像ファイルを読み込む
img = Image.open(path)
exif = { ExifTags.TAGS[k]: v for k, v in img._getexif().items() if k in ExifTags.TAGS }
exif_datetime = [v for k, v in exif.items() if k == "DateTimeOriginal"]
exif_datetime_str = (exif_datetime[0].split(':')[0])[2:4] + exif_datetime[0].split(':')[1] + (exif_datetime[0].split(':')[2])[0:2]
# ファイルパスを文字列に変換する
path_str = str(path)
# ファイル名を抽出する(スラッシュで分割した最後の文字列)
filename = path_str.split('/')[-1]
# RAWファイル名を生成する
filename_raw = filename.split('.')[0] + '.NEF'
# RAWファイルのコピー元を生成する
filename_raw_src = '/NIKON D500 /DCIM/101ND500/' + str(filename_raw)
# RAWファイルのコピー先を生成する
filename_raw_dest = '/photo/D500/'+ str(exif_datetime_str) + '/' + str(filename_raw)
print(f'RAWコピー元 {filename_raw_src}')
print(f'RAWコピー先 {filename_raw_dest}\n')
filename_jpeg_dest = '/photo/D500/'+ str(exif_datetime_str) + '/' + str(filename)
print(f'JPEGコピー元 {path}')
print(f'JPEGコピー先 {filename_jpeg_dest}\n')
# JPGファイルをコピーする
shutil.copy2(path,filename_jpeg_dest)
# RAWファイルをコピーする
try:
shutil.copy2(filename_raw_src,filename_raw_dest)
except FileNotFoundError :
pass
# Macのデスクトップ通知
def main():
os.system("osascript -e 'display notification \"Nikonファイルコピー\nコード実行完了\"'")
if __name__ == '__main__':
main()