「Exifから位置情報を取り出す方法」で”TypeError: 'IFDRational' object is not subscriptable”が出て詰みそうになった話

またまた「Pythonではじめる Webサービス&スマホアプリの書きかた・作りかた」で勉強しているときに引っかかったので備忘録。

参考書籍

写真(画像)に含まれている位置情報をExifで取り出して表示させるプログラムがあったのですが、配布されたPythonファイルをそのまま実行すると下記のエラーが出てしまいました。

  File "C:\Users\newko\book-webservice-python-master\src\ch5\exif_gps.py", line 22, in conv_deg
    d = float(v[0][0]) / float(v[0][1])
TypeError: 'IFDRational' object is not subscriptable

どうやらdという変数に入れてるタイプがおかしいというのはド素人の自分にもわかったのですが、素直にエラーコードをググってみました。

すると同じようなエラーで困っているプログラミングビギナー外国人の方がこんな質問をされてました。

この質問には回答が一つだけついており、どうも緯度経度を計算する式のところで不要な計算をしてしまっているようでした。

なので書籍「Pythonではじめる Webサービス&スマホアプリの書きかた・作りかた」に載っている下記のコードを

def conv_deg(v):
    # 分数を度に変換
    d = float(v[0][0]) / float(v[0][1])
    m = float(v[1][0]) / float(v[1][1])
    s = float(v[2][0]) / float(v[2][1])
    return d + (m / 60.0) + (s / 3600.0)

こちらに変更することでスッキリ解決しました。

def conv_deg(v):
    # 分数を度に変換
    d = float(v[0])
    m = float(v[1])
    s = float(v[2])
    return d + (m / 60.0) + (s / 3600.0)

自分なりに(30分程詰んだレベル)調べたらどうも昔は前の計算で行けたっぽいですね。この書籍が発売されたのが2020年6月で、プログラミングビギナー外国人が質問していたのが2020年10月。

その間にPillowのアップデートか何かで"v[0][0]"みたいな形(なんて言えばいいのか知らないくらいプログラミングnoob)が受け付けなくなったのかなーなんてふんわり理解しました♡

ITの世界は変化が目まぐるしいので数ヶ月前のコードが使えない!なんてことは日常茶飯事なんでしょうか?

こういち
先が思いやられるわー

最後に!見知らぬ質問をしたプログラミングビギナー外国人さん、バッチリ回答を示してくれた玄人外国人さんThanks a million!!

おすすめの記事