029_フォルダーに振り分け

写真を「撮影日」と「場所」でフォルダ分けするプログラミング解説~EXIF情報&API~

今回は、Pythonを使って撮影した写真を自動で「撮影日」と「撮影場所」にフォルダ分けする方法をご紹介します(^_-)-☆

撮影場所のフォルダの中に撮影日ごとのフォルダに仕分けることもできますし、撮影日のみ、撮影場所のみに仕分けることも可能な万能なプログラムになっています!

こんな方におススメ(*´▽`*)
・写真のEXIF情報を元にしたプログラムを書いてみたい
・写真が大量にあるので、撮影日と場所で仕分けしたい

今回カギになる技術は、Web APIとEXIF情報の加工です。

EXIF情報とは?
スマホやデジカメで撮影した写真に付く撮影情報のことです。スマホやデジカメで撮影した写真は、サイズや色の情報、撮影した日時や機器の種類と型番、解像度などの詳細なデータを画像とあわせて自動で保存されます。これがEXIF情報です(^_-)-☆

写真のEXIF情報を確認してみたい人は、次のサイトなどを利用すると確認することができます。

概要

今回のソースコードは、次のような流れになります(=゚ω゚)ノ

1、写真に保存されているEXIF情報から、位置情報(緯度、経度)と撮影日時を取得
2、緯度、経度をYahoo!JapanのAPIの仕様に合わせて変換
3、Yahoo!JapanのAPIで場所の情報を取得
4、撮影場所フォルダの中に、さらに各日付ごとにフォルダを作成して、その中に写真を保存する
※写真にEXIF情報が保存されていない場合は、仕分けることができません。

EXIF情報には撮影場所として、緯度、経度が保存されていますが、住所は保存されていません。そのため、緯度、経度から住所を算出するためにYahoo!Japanの「Yahoo!リバースジオコーダAPI」というAPIを利用します。

ヤフー会員であれば、簡単にClient IDが取得できますので、まずはディベロッパーネットワークに登録して、Client IDを取得しましょう。

キャプチャ4_1

完成したコードを実行したイメージ

完成したコードを実行するときは、まず次のようにローカルフォルダに実行したいpythonファイルと、仕分けしたい写真を格納します。

キャプチャ

そして、コマンドプロンプトを開き、写真とpythonファイルが保存してあるフォルダにリナックスのコマンド"cd"で移動します。その後、次のコードを実行します。

※ライブラリーがインストールされていない場合は、pipでインストールするのを忘れないようにしましょう!

python ファイル名

実行すると次のようにコンソール上に順番に写真を解析して、順番にフォルダに入れている状況が確認できます。

キャプチャ1

また、実行が終了すると次のようにフォルダ分けされております。

キャプチャ2

各撮影場所のフォルダを開くと次のように撮影日時ごとにフォルダ分けされます。始めにご説明しましたように今回は、場所の中に日付で仕分けしておりますが、どちらかだけで実行、または、逆に撮影日フォルダの中に場所ごとに仕分けるということもできるプログラムになっています(^^♪

キャプチャ3

それでは、順にコードの解説をしていきます(^_-)-☆

プログラムの全体像を決める

はじめの概要で解説したように1~4の順番に関数を作っていきます。まず、写真に保存されているEXIF情報から、位置情報と撮影日時を取得します。次に緯度、経度をYahoo!JapanのAPIの仕様に合わせて変換します。そして、その情報を元にYahoo!JapanのAPIで場所の情報を取得します。最後に、撮影場所フォルダの中に、さらに各日付ごとにフォルダを作成して、その中に写真を保存するという流れになります。

1. 写真に保存されているEXIF情報から、位置情報(緯度、経度)と撮影日時を取得する

今回はEXIF情報を取得するためのライブラリーとしてpythonでよく使われるpillowを利用します。

from PIL import Image

def get_exif(filename):
   exif = Image.open(filename)._getexif()

まず、写真を開くためにpillowのImageモジュールをインポートします。次に、画像ファイルを"open"で開き、関数"_getexif()"でEXIF情報を取得して、変数"exif"に代入します。

ここから先は

16,834字

¥ 1,200

この記事が気に入ったらサポートをしてみませんか?