如何在Python中解析这个JSON文件?

如何在Python中解析这个JSON文件?,python,json,exif,exiftool,Python,Json,Exif,Exiftool,我有一个非常简单的任务-我有一个图像和视频文件列表,我想用可用的EXIF数据将每个文件的创建日期制成表格。我使用的是实际的数据提取 我可以毫无问题地提取数据,但是得到的JSON输出有一个非常奇怪的形状。每个记录有一个字段,但该字段可能包含2、3或多个信息位 例如,一些图像文件包含XMP:CreateDate和EXIF:CreateDate,而MOV文件包含“QuickTime:CreateDate”(我不知道其他文件格式的字段是什么) 我完全不知道如何解析这个文件,我不能像普通JSON文件那样循

我有一个非常简单的任务-我有一个图像和视频文件列表,我想用可用的EXIF数据将每个文件的创建日期制成表格。我使用的是实际的数据提取

我可以毫无问题地提取数据,但是得到的JSON输出有一个非常奇怪的形状。每个记录有一个字段,但该字段可能包含2、3或多个信息位

例如,一些图像文件包含
XMP:CreateDate
EXIF:CreateDate
,而MOV文件包含“QuickTime:CreateDate”(我不知道其他文件格式的字段是什么)

我完全不知道如何解析这个文件,我不能像普通JSON文件那样循环遍历它。我只想提取一个文件名和创建日期时间。如果有任何建议,我将不胜感激

谢谢

编辑生成“JSON”输出的代码如下:

def old_main():
    dir_name = '/Users/Documents/Projects/ExifData/temp/'
    tags = ["File Name", "CreateDate"]
    log_file = 'py_log.txt'
    file_names = getListOfFiles(dir_name)
    with exiftool.ExifTool() as e:
        metadata = e.get_tags_batch(tags, file_names)
    with open(log_file, "w") as outfile:
        json.dump(metadata, outfile)
所以我粘贴的是
json.dump
方法的直接输出。记录了
get\u tags\u batch
方法

除非我误解了这个包的文档,否则它看起来根本不是JSON,而是一个字符串


感谢您的指点和评论。

从您发布的代码片段来看,它是一个
目录的
列表。如果格式比这更复杂,请发布一个更完整的例子

这是一种迭代每个项目并根据找到的第一个日期字段设置日期的简单方法

results = []

for item in json_list:
    d = {'SourceFile': item['SourceFile']}
    date_keys = [k for k in item.keys() if 'CreateDate' in k]
    if date_keys:
        d['Date'] = item[date_keys[0]]
    else:
        d['Date'] = None
    results.append(d)

解析这个“JSON”时遇到问题的原因是它不是
JSON
(注意使用单引号而不是双引号)。未经修改,无法使用
JSON
解析器对其进行解析

而是使用:

from ast import literal_eval

t = """[{'SourceFile': '/Users/Documents/Projects/ExifData/temp/IMG_20200422_085514.JPG', 'EXIF:CreateDate': '2020:04:22 08:55:14', 'XMP:CreateDate': '2020:04:22 08:55:14'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/IMG_20200423_091856.JPG', 'EXIF:CreateDate': '2020:04:23 09:18:57'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/IMG_20200423_091859.JPG', 'EXIF:CreateDate': '2020:04:23 09:19:00', 'XMP:CreateDate': '2020:04:23 09:19:00'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0004.mp4', 'QuickTime:CreateDate': '2017:03:11 13:05:59'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0005.mp4', 'QuickTime:CreateDate': '2017:03:11 13:08:26'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0006.mp4', 'QuickTime:CreateDate': '2017:03:11 13:09:17'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0035.mp4', 'QuickTime:CreateDate': '2017:03:12 14:08:55'}]"""
o = literal_eval(t)
print(o)
印刷品:

[{'SourceFile': '/Users/Documents/Projects/ExifData/temp/IMG_20200422_085514.JPG', 'EXIF:CreateDate': '2020:04:22 08:55:14', 'XMP:CreateDate': '2020:04:22 08:55:14'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/IMG_20200423_091856.JPG', 'EXIF:CreateDate': '2020:04:23 09:18:57'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/IMG_20200423_091859.JPG', 'EXIF:CreateDate': '2020:04:23 09:19:00', 'XMP:CreateDate': '2020:04:23 09:19:00'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0004.mp4', 'QuickTime:CreateDate': '2017:03:11 13:05:59'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0005.mp4', 'QuickTime:CreateDate': '2017:03:11 13:08:26'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0006.mp4', 'QuickTime:CreateDate': '2017:03:11 13:09:17'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0035.mp4', 'QuickTime:CreateDate': '2017:03:12 14:08:55'}]
根据手册,
literal\u eval

安全地计算表达式节点或包含Python文本或容器显示的字符串。提供的字符串或节点只能由以下Python文本结构组成:字符串、字节、数字、元组、列表、dicts、set、boolean和None


如果OP的描述是准确的,那么输入来自一个文件,因此它是一个字符串而不是dict。但是它的格式不正确
JSON
是的,我添加了一些关于如何生成文件的示例代码。但我设法找出了我的错误所在。这不是
JSON
。请注意单引号,它永远不会用于定义字符串文字。
[{'SourceFile': '/Users/Documents/Projects/ExifData/temp/IMG_20200422_085514.JPG', 'EXIF:CreateDate': '2020:04:22 08:55:14', 'XMP:CreateDate': '2020:04:22 08:55:14'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/IMG_20200423_091856.JPG', 'EXIF:CreateDate': '2020:04:23 09:18:57'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/IMG_20200423_091859.JPG', 'EXIF:CreateDate': '2020:04:23 09:19:00', 'XMP:CreateDate': '2020:04:23 09:19:00'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0004.mp4', 'QuickTime:CreateDate': '2017:03:11 13:05:59'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0005.mp4', 'QuickTime:CreateDate': '2017:03:11 13:08:26'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0006.mp4', 'QuickTime:CreateDate': '2017:03:11 13:09:17'}, {'SourceFile': '/Users/Documents/Projects/ExifData/temp/MOV_0035.mp4', 'QuickTime:CreateDate': '2017:03:12 14:08:55'}]