2025/11/21(金) [n年前の日記]
#1 [golang] Go言語を勉強してたけどちょっと躊躇し始めた
Go言語(golang)を使って、Jpeg画像内のExif情報から撮影日を取得して、撮影日別にディレクトリを作ってそこに各ファイルを移動するツールを作れないかと色々勉強してたのだけど…。
こういうのはGo言語でやらなくてもいいのではないかと思えてきた…。Go言語の便利なところの一つとして、1ファイルの実行バイナリにできて配布が楽という点があるけれど、そもそも自分しか使わないツールだし、仮に配布したとしても機能に不満があって修正したいと思った時に他者が手を入れるのも面倒というか…。
Pythonでやってしまったほうがいいのではないかな…。どうせ自分しか使わないし…。後から何か修正したいと思った時もスクリプトソースを修正すれば即座に反映されるし…。
こういうのはGo言語でやらなくてもいいのではないかと思えてきた…。Go言語の便利なところの一つとして、1ファイルの実行バイナリにできて配布が楽という点があるけれど、そもそも自分しか使わないツールだし、仮に配布したとしても機能に不満があって修正したいと思った時に他者が手を入れるのも面倒というか…。
Pythonでやってしまったほうがいいのではないかな…。どうせ自分しか使わないし…。後から何か修正したいと思った時もスクリプトソースを修正すれば即座に反映されるし…。
◎ Pythonで書いてみた :
Go言語を使ってやろうとしてたことをPythonでやってみた。Go言語では半日かかっても実装できなかった処理が30分ぐらいで書けてしまった…。まあ、慣れてるというのが大きいけれど…。
_mvjpgbydate.py
実行すると以下のような感じになる。
今回は Google Gemini に色々尋ねながら書いた。Pillow で Exif を読み取れるとは知らなかった…。「2025:11:13 13:08:25」という表記を YYYYMMDD に変換するあたりもなるほどと…。いや、どれも誰かが書いてくれた記述がネット上のどこかにあるんだろうけど。
_mvjpgbydate.py
"""
カレントディレクト内のjpeg画像のExifを読み取って、
日付別でディレクトリを作成してファイル移動するスクリプト。
Windows11 x64 25H2 + Python 3.10.10 64bit
"""
import glob
import os
from PIL import Image
from PIL.ExifTags import TAGS
import shutil
def get_jpeg_shooting_date(image_path: str) -> str:
EXIFTAGS = ["DateTimeOriginal", "DateTimeDigitized", "DateTime"]
exif_tag_map = {v: k for k, v in TAGS.items()}
try:
im = Image.open(image_path)
exif_data = im._getexif()
if exif_data is None:
print(f"Not found Exif : {image_path}")
return None
for tagname in EXIFTAGS:
tag_id = exif_tag_map.get(tagname)
if tag_id in exif_data:
return exif_data[tag_id]
return None
except FileNotFoundError:
print(f"Not found '{image_path}'")
except Exception as e:
print(f"Error: {e}")
return None
def get_jpeg_files() -> list:
jpg_files = glob.glob("*.jpg")
jpeg_files = glob.glob("*.jpeg")
JPG_files = glob.glob("*.JPG")
JPEG_files = glob.glob("*.JPEG")
return list(set(jpg_files + jpeg_files + JPG_files + JPEG_files))
def make_dir(dirname: str):
if os.path.isdir(dirname):
# print(f" Skip. Exist directory : {dirname}")
pass
else:
print(f"Create directory '{dirname}'")
try:
os.mkdir(dirname)
except FileExistsError as e:
print(f"Error : Exist directory : {e}")
except FileNotFoundError as e:
print(f"Error : Directory not found : {e}")
def main():
filelist = get_jpeg_files()
if len(filelist) <= 0:
print("Jpeg files not found.")
return
print(f"Jpeg {len(filelist)} files found.")
for fn in filelist:
datetime = get_jpeg_shooting_date(fn)
if datetime is None:
datetime = "Not found Exif"
dirname = ""
else:
s = datetime.split(" ")[0]
dirname = s.replace(":", "")
print(f"Found '{fn}' ({datetime})")
if dirname != "":
# Create directory
make_dir(dirname)
newfn = os.path.join(dirname, fn)
if os.path.exists(newfn):
print(f"'{newfn}' already exists. Skipping.")
else:
# move file
new_path = shutil.move(fn, dirname)
print(f"Moved to '{new_path}'")
if __name__ == "__main__":
main()
実行すると以下のような感じになる。
>python mvjpgbydate.py Jpeg 4 files found. Found 'P_20251115_112259.jpg' (2025:11:15 11:22:59) Create directory '20251115' Moved to '20251115\P_20251115_112259.jpg' Found 'P_20251117_193010.jpg' (2025:11:17 19:30:09) Create directory '20251117' Moved to '20251117\P_20251117_193010.jpg' Found 'P_20251113_130825.jpg' (2025:11:13 13:08:25) Create directory '20251113' Moved to '20251113\P_20251113_130825.jpg' Found 'P_20251113_130817.jpg' (2025:11:13 13:08:16) Moved to '20251113\P_20251113_130817.jpg'
今回は Google Gemini に色々尋ねながら書いた。Pillow で Exif を読み取れるとは知らなかった…。「2025:11:13 13:08:25」という表記を YYYYMMDD に変換するあたりもなるほどと…。いや、どれも誰かが書いてくれた記述がネット上のどこかにあるんだろうけど。
[ ツッコむ ]
以上です。