Magicode logo
Magicode
0
3 min read

(プチ修正版)写真の中に隠れているデータをcsv一覧にする

前回のコードだと

000.jpg,

001.jpg,2017:12:29 09:37:08

002.jpg,

003.jpg,

004.jpg,2022:04:01 17:41:41

005.jpg,2022:05:14 16:53:32 のように1行空行がある状態でcsvが保存されてましたのをさっき気づきました。

ファイルオープンの処理の際、パラメータにnewline=""を入れてやると解決されて

000.jpg, 001.jpg,2017:12:29 09:37:08 002.jpg, 003.jpg, 004.jpg,2022:04:01 17:41:41 005.jpg,2022:05:14 16:53:32

のように空きがなく保存されます。

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', newline="") #2022-05-31 optionにnewline入れないと一行空くので注意!!!!
for i in files_df:
    list=[i,files_df[i][36868]] #リスト作成→[カラム名(〇〇〇.jpg, 撮影時間)]
    writer = csv.writer(f)
    writer.writerow(list)
f.close()

Discussion

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