Как вывести JSON с PyExifTool - PullRequest
       62

Как вывести JSON с PyExifTool

0 голосов
/ 26 апреля 2020

Я запускаю следующий код для вывода списка файлов изображений и видео на общем диске вместе с датой создания. Однако я просто не могу заставить метод execute_json работать должным образом. Документация для проекта не является обширной.

def main():
    dir_name = '/Volumes/photo/phone backup/'
    tags = ["File Name", "CreateDate"]
    log_file = '/Volumes/photo/py_log.txt'

    file_names = getListOfFiles(dir_name)
    with exiftool.ExifTool() as e:
        metadata = e.execute_json(str(e.get_tags_batch(tags, file_names)))
    f = open(log_file, "w")
    f.write(metadata)
    f.close()

Я получаю ошибку AttributeError: 'list' object has no attribute 'encode'. Если я немного изменю код на это,

    file_names = getListOfFiles(dir_name)
    with exiftool.ExifTool() as e:
        metadata = e.get_tags_batch(tags, file_names)
    f = open(log_file, "w")
    f.write(str(metadata))
    f.close()

Полученный файл имеет этот формат,

[{'SourceFile': '/Volumes/photo/phone backup/2017-05/MOV_0112.mp4', 'QuickTime:CreateDate': '2017:04:30 13:56:18'}, {'SourceFile': '/Volumes/photo/phone backup/2017-05/MOV_0174.mp4', 'QuickTime:CreateDate': '2017:06:09 06:12:47'}, {'SourceFile': '/Volumes/photo/phone backup/2017-05/MOV_0141.mp4', 'QuickTime:CreateDate': '2017:05:14 16:36:10'}

Когда я пытаюсь сериализовать этот файл, я получаю ошибку, что это недопустимо JSON.

Буду признателен за некоторую помощь, поскольку я совершенно потерян.

Я мог бы заменить «на» себя, но это кажется крайне неудачным решением.

РЕДАКТИРОВАТЬ После того, как поигрался с ним немного больше - я делаю json.dump вызов на выходе metadata. После этого вызов его с помощью json.load не проблема. Но выполните следующее ,

for key in file_data:
    print (key)

приводит к такому выводу,

{'SourceFile': '/Volumes/photo/phone backup/2017-05/MOV_0112.mp4', 'QuickTime:CreateDate': '2017:04:30 13:56:18'}
{'SourceFile': '/Volumes/photo/phone backup/2017-05/MOV_0174.mp4', 'QuickTime:CreateDate': '2017:06:09 06:12:47'}

Так что это не правильно отформатированный вывод JSON, который выплевывает ExifTool. Это просто большой текстовый дамп.

1 Ответ

1 голос
/ 26 апреля 2020

Я думаю, что вы не понимаете документацию. Если мы посмотрим на документы по методу execute_json, он говорит:

Выполнить заданный пакет параметров и проанализировать вывод JSON.

Этот метод похож на : пе: меты: execute(). Он автоматически добавляет параметр -j для запроса JSON вывода из exiftool и анализирует вывод. Возвращаемое значение представляет собой список словарей, отображающих имена тегов на соответствующие значения.

Это ясно говорит о том, что модуль exiftool анализирует выходные данные , то есть он читает данные JSON и возвращает список Python структур данных.

Аналогично, документация для get_tags_batch гласит:

Формат возвращаемого значения такой же, как и для: py: meth: execute_json().

Итак, когда вы делаете это ...

    file_names = getListOfFiles(dir_name)
    with exiftool.ExifTool() as e:
        metadata = e.get_tags_batch(tags, file_names)
    f = open(log_file, "w")
    f.write(str(metadata))
    f.close()

... вы просто записываете строковое представление этих данных в файл (т. Е. Вывод str(metadata)). Если вы действительно хотите записать JSON данные, вам потребуется import json, а затем:

with open(log_file, 'w') as fd:
  json.dump(metadata, log_file)

Для чтения в этом файле мы будем использовать json.load:

with open(log_file, 'r') as fd:
  metadata = json.load(fd)

Это дает нам оригинальный список словарей. Например, мы можем перебрать его так:

for imageinfo in metadata:
  print('CreateDate:', imageinfo.get('EXIF:CreateDate', 'unknown'))

Вот полный пример кода, который я использовал для проверки этого:

import exiftool
import json
import os


file_names = [f'images/{fn}' for fn in os.listdir('images')]
tags = ["File Name", "CreateDate"]
with exiftool.ExifTool() as e:
    metadata = e.get_tags_batch(tags, file_names)

with open('md.json', 'w') as fd:
    json.dump(metadata, fd)


with open('md.json', 'r') as fd:
    metadata = json.load(fd)


for imageinfo in metadata:
    print('Created: {}'.format(
        imageinfo.get('EXIF:CreateDate', 'unknown')
    ))

Запуск этого в моем локальном каталоге images, который содержит 7 случайных изображений, в результате:

Created: 2020:01:26 15:06:12
Created: 2020:04:16 18:13:48
Created: unknown
Created: unknown
Created: 2020:01:26 15:05:54
Created: 2020:04:16 18:07:41
Created: 2020:01:26 15:07:58
...