#python #windows #date #photo #exif
Вопрос:
Мой код Exif не удался в моем проекте, поэтому фотографии вышли без поля «дата съемки». К счастью, я сохранил их с датой, взятой в качестве заголовка, например. «-Forward14-07-2021-08-23-25.jpg». У меня есть тысячи таких фотографий. Я могу добавить это отдельно, используя этот код python.
from datetime import datetime import piexif s = "13" m = "17" h = "09" dd = "14" mm = "07" yyyy = "2021" name = "-Forward" filename = str(name) str(dd) "-" str(mm) "-" str(yyyy) "-" str(h) "-" str(m) "-" str(s) ".jpg" exif_dict = piexif.load(filename) new_date = datetime(int(yyyy), int(mm), int(dd), int(h), int(m), int(s)).strftime("%Y:%m:%d %H:%M:%S") exif_dict['0th'][piexif.ImageIFD.DateTime] = new_date exifif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal] = new_date exif_dict['Exif'][piexif.ExifIFD.DateTimeDigitized] = new_date exif_bytes = piexif.dump(exif_dict) piexif.insert(exif_bytes, filename)
Как только я пробую это как цикл, это не работает.
import PIL.Image import piexif from datetime import datetime from PIL import Image #import os #do not change these: s = "0" m = "0" h = "07" #change these: dd = "14" mm = "07" yyyy = "2021" Dir = "D:Python codestest" #insert file directory here## #run code twice, once for pavement and once for forward photos name = "-Forward" #"-Pavement" #for filename in os.listdir(dir): for h in range (7,17): for m in range (1,61): for s in range (1,61): if (int(s) lt; 10): s = "0" str(s) if (int(m) lt; 10): m = "0" str(m) if (int(h) lt; 10): h = "0" str(h) else: s = int(s) m = int(m) h = int(h) try: filename = str(name) str(dd) "-" str(mm) "-" str(yyyy) "-" str(h) "-" str(m) "-" str(s) ".jpg" exif_dict = piexif.load(filename) new_date = datetime(int(yyyy), int(mm), int(dd), int(h), int(m), int(s)).strftime("%Y:%m:%d %H:%M:%S") exif_dict['0th'][piexif.ImageIFD.DateTime] = new_date exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal] = new_date exif_dict['Exif'][piexif.ExifIFD.DateTimeDigitized] = new_date exif_bytes = piexif.dump(exif_dict) piexif.insert(exif_bytes, filename) ##insert right directory # im = Image.open(Dir name str(dd) "-" str(mm) "-" str(yyyy) "-" str(h) "-" str(m) "-" str(s)) #im.save(Dir name str(dd) "-" str(mm) "-" str(yyyy) "-" str(h) "-" str(m) "-" str(s), exif=exif_bytes, quality="keep", optimize=True) s = int(s) 1 except: s = int(s) 1 m = int(m) 1 h = int(h) 1
Комментарии:
1. Что значит «это не работает»? Чего вы ожидаете и что вы наблюдаете вместо этого?
2. Я имею в виду, что на фотографиях все еще нет значения даты съемки. Я должен добавить попытку и, за исключением того, что там нет набора фотографий, например. -Forward14-07-2021-08-23-25.jpg затем … Forward14-07-2021-08-23-26.jpg и так далее. поэтому, чтобы предотвратить ошибку, при которой имя файла не существует, я должен попробовать и, кроме
3. из-за попыток и исключений программа не показывает мне никаких ошибок, но я не знаю, как их устранить
4. Вы можете заменить
except
наexcept FileNotFoundError
, чтобы другие ошибки не игнорировались.5. Если фактический код для обработки exif работает, то проблема должна заключаться в повторении имен файлов. Возможным способом отладки было бы распечатать каждое имя файла и проверить, есть ли среди них нужные вам файлы. Кроме того, я предлагаю вам использовать что-то вроде
os.walk
перебора файлов вместо построения путей к файлам, подобных этому. Кроме того, я предлагаю вам, как правило, создавать резервную копию ваших файлов на случай, если ваш сценарий пойдет не так.
Ответ №1:
Я провел еще несколько исследований и выяснил, что try:
except:
проблема заключалась в «и». Рабочий код можно посмотреть ниже для тех, кто заинтересован. Спасибо за помощь!
import PIL.Image from os import path import piexif from datetime import datetime from PIL import Image import os # do not change these: s = 0 M = 0 h = 7 # change these: dd = "14" mm = "07" yyyy = "2021" # run code twice, once for pavement and once for forward photos name = "-Forward" # "-Pavement" # for filename in os.listdir(dir): for a in range(7, 17): M = 0 for b in range(1, 61): s = 0 for c in range(1, 61): ss = str(s) MM = str(M) hh = str(h) if s lt; 10: ss = "0" str(s) if M lt; 10: MM = "0" str(M) if h lt; 10: hh = "0" str(h) filename = str(name) str(dd) "-" str(mm) "-" str(yyyy) "-" str(hh) "-" str( MM) "-" str(ss) ".jpg" #try: if path.exists(filename): # filename = str(name) str(dd) "-" str(mm) "-" str(yyyy) "-" str(h) "-" str(m) # "-" str(s) ".jpg" exif_dict = piexif.load(filename) new_date = datetime(int(yyyy), int(mm), int(dd), h, M, s).strftime("%Y:%m:%d %H:%M:%S") exif_dict['0th'][piexif.ImageIFD.DateTime] = new_date exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal] = new_date exif_dict['Exif'][piexif.ExifIFD.DateTimeDigitized] = new_date exif_bytes = piexif.dump(exif_dict) piexif.insert(exif_bytes, filename) # #insert right directory im = Image.open(Dir name str(dd) "-" str(mm) "-" str(yyyy) # "-" str(h) "-" str(m) "-" str(s)) im.save(Dir name str(dd) "-" str(mm) "-" str( # yyyy) "-" str(h) "-" str(m) "-" str(s), exif=exif_bytes, quality="keep", optimize=True) s = 1 #except: s = 1 M = 1 h = 1