Дата Exif, сделанная для нескольких фотографий — Python

#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