Magicode logo
Magicode
0
3 min read

写真の中に隠れているデータをcsv一覧にする

どこに需要あるかわかりませんが写真のexifファイルを抜き出してcsv一覧にするというプログラムを作っております。流れとしては

①写真を一つのフォルダに格納 ②写真のファイル名を統一したいので000.jpgみたいに 『採番+.jpg』という形式にする ③ファイル名と撮影日時をexifファイルから抜き出す ④抜き出したデータをcsvに保存

なにかの解析とか追跡に使えないですかね。っていうかなんでこんなプログラム俺つくってるんですかね。

import os
import glob
from PIL import Image, ExifTags#Pillowモジュールのインポート
import pandas as pd
import csv
'''
jpgファイル名の書き換えOOx.jpg

'''
path = "./pic/"   #これは./ と pic/を合わせたもの。: 同じ階層のpicというフォルダの下
try:
    files = glob.glob(path + '*.jpg')#picフォルダの下に進んでほにゃらら.jpgを取得
except:
    print('対象のディレクトリがありません')
#enumurateを使うと、返り値としてインデックス番号とファイル名が取れる

for i, f in enumerate(files):#iがインデックス=0,1,2,3; ,fがファイル名。つまり*.jpgが入る) 
    os.rename(f, os.path.join(path, '{0:03d}'.format(i)  + '.jpg'))#インデックスを3桁で0埋め 
#os.renameは第一引数=対象のファイル名。第二引数がどんなふうに名前変えるの?という指
#フォルダ内から写真ファイルをとる
#----------------------------------------------------------------------------------------------#


#----------------------------jpgファイル取得しつつexifファイルを取得----------------------------#
file_list = list() #jpgデータそのものを入れる辞書

list_2 ={} #これは上のjpgデータからexifファイルを取り出したものを入れる辞書
i=0
for file in files: #filesという、〇〇jpgの名前が入ったデータを一個ずつfileにいれる
    img =Image.open(file) #fileはあくまで名前つまりただの文字列。名前からopenをつかって実際にjpgのデータを取ってくる
    file_list.append(img) #file_listオブジェクトのappendメソッドを使ってimg(jpgデータ)を辞書に追加
    img.close()#いじったあとの後片付け(そうしないと他の人;他のプログラムで取り出せなくなる)
    #この時点でfile_list[./pic//000.jpg, ./pic//001.jpg]というインデックスが出来上がる
    file = file.replace('./pic\\', '')  # 重要!!!!'./pic//'を削除(空文字列に置換)
    list_2[file] = file_list[i]._getexif() #list_2[file] は空のlist_2にfile(000.jpg,001.jpg)というインデックス文字を追加
    #つまり一周目の辞書の中身は list_2[000.jpg]=file_list[0]のexifファイルがはいる。file_liset[0]というのは000.jpg自体のexifファイル
    

    #追加した後でexifファイルをそのインデックスと紐づけて格納
    i+=1

#この時点で→ list_2[{000.jpg:たくさんのexif},{001.jpg:たくさんのexif}]



'''
dfつくって'filename, date'のカラムつくる
'''
#いろいろいじりたいから、データの塊(リスト)からオブジェクトの塊にする
files_df = pd.DataFrame(list_2)

f = open('out.csv', 'w')
for i in files_df:
    list=[i,files_df[i][36868]] #リスト作成→[カラム名(〇〇〇.jpg, 撮影時間)]
    writer = csv.writer(f)
    writer.writerow(list)
f.close()

Discussion

コメントにはログインが必要です。