果報は寝て待て: 1月 2023

2023年1月15日日曜日

フォルダ内にある同一の画像ファイルを整理する

長年、いろんなデジタルカメラで写真を撮って、それをHDDに溜め込んでると、いつの間にか同じ画像が複数の名前で保存されてる、ってこと無いですか?

 10枚20枚くらいなら、目視で、これとこれダブってるわ、と削除できるのですが、数千枚が一つのディレクトリに溜め込んでると人間ではどうしようもありません。

今回、PYTHONを使って、HDDに溜め込んでた、JPGファイルで同じ画像を1つだけ残してあとは削除するコードを作成して、ファイルを整理してみました。

同一かどうかを判定する方法にはいくつかあるのですが、今回は、pyexiv2というモジュールを使って撮影日時が同一かどうかを調べて判定します。

 

以下の流れとなります

1 PYTHONCODEと同じディレクトリに対象の画像ファイルを置く
2  jpgファイルがあればJPGに変換する
3  JPGファイルの更新日付を読み込む
4 フォルダ内の1枚めのファイルと同じ更新日付のJPGファイルを探しファイル名をリストにする
5 リスト内に1枚残し、あとは削除用リストにコピーする

6 すべてのファイルに対して同じ操作を行う

7 削除用リストで重複が無いよう、SET型に変更する

8 削除用リスト内のファイル名のファイルを削除する

 

 

 # -*- coding: utf-8 -*-
"""
Spyder Editor

1 PYTHONCODEと同じディレクトリに対象の画像ファイルを置く
2  jpgファイルをJPGに変換する
3  jpgファイルの更新日付を読み込む
4 フォルダ内のファイルと同じ更新日付のjpgファイルを探す
5 同じならば、そのファイルを削除する
6 すべてのファイルに対して同じ操作を行う

"""
import pyexiv2
import glob
import os

"""
jpgファイルをJPGに変換する
"""
all_list_before = glob.glob('*.jpg') #
for list_before in all_list_before :
    print(list_before)
    basename_without_ext = os.path.splitext(os.path.basename(list_before))[0]
    print(basename_without_ext)
    os.rename(basename_without_ext+".jpg",basename_without_ext+".JPG")
    print(basename_without_ext+".JPG")


def date_time(jpg_file): # jpgファイルの更新日付を読み込む
    pyexiv2.set_log_level(4)
    img = pyexiv2.Image(jpg_file)
    
    metadata = img.read_exif()
    #print(metadata)
    if metadata == {} :
        time_jpg = None
    else :
        time_jpg = metadata['Exif.Photo.DateTimeOriginal']

    #print("DateTimeOriginal:", time_jpg)
    img.close()
    return time_jpg



start_list = glob.glob('*.JPG') # フォルダ内のjpgファイル名を読み込む
all_delete_list =[]
for jpg_file in start_list:
    delete_list =[]
    time_a = date_time(jpg_file)
    #print("tume_a = ",jpg_file,time_a)
    if time_a == None :
        continue
    for serch_file in start_list :
        #print("serch_file = ",serch_file)
        time_b = date_time(serch_file)
        #print("time_b  = ",serch_file,time_b)
        if time_b == None :
            continue
        if time_a == time_b :
            delete_list.append(serch_file)
    print(delete_list)
    if len(delete_list) > 1 :
        for i in range(len(delete_list)-1) :
            print(delete_list[i+1])
            all_delete_list.append(delete_list[i+1])
print(all_delete_list)
all_delete_list = list(set(all_delete_list)) # 2枚以上あれば1枚にする
print(all_delete_list)
for delete_file in all_delete_list :
    os.remove(delete_file)

完璧ではありません。

メタデータがもともと削除されてるとそのまま残ります。

またもともと壊れてるJPGファイルは手で取り除く必要があります。

でも手作業よりははるかに助かりました。