从 python 中的 S3 读取多对象 json gz 文件

Read multi object json gz file from S3 in python

我在 S3 存储桶中有一些文件,我正在尝试以最快的方式读取它们。该文件的格式为 gzip,其中有一个多对象 json 文件,如下所示:

{"id":"test1", "created":"2020-01-01", "lastUpdated":"2020-01-01T00:00:00.000Z"}
{"id":"test2", "created":"2020-01-01", "lastUpdated":"2020-01-01T00:00:00.000Z"}

我想要做的是加载 json 文件并读取每个对象并对其进行处理。经过一些研究,这是唯一对我有用的代码

import json
import gzip
import boto3
from io import BytesIO

s3 = boto3.resource('s3')
bucket = s3.Bucket("my-bucket")

for obj in bucket.objects.filter(Prefix='my-prefix').all():
    buffer = BytesIO(obj.get()['Body'].read())
    gzipfile = gzip.GzipFile(fileobj=buffer)
    for line in gzipfile:
        json_object = json.loads(line)
        # some stuff with the json_object

有人知道读取 json 对象的更好方法吗?

感谢您的帮助

获得缓冲区后,尝试以下操作

decompressed = gzip.decompress(buffer) json_lines = json.loads(decompressed) for json_obj in json_lines: # Do stuff

经过一些研究,我发现库 smart-open 非常有用且易于使用。

from smart_open import open
import json

s3_client = s3_session.client("s3")
source_uri = 's3://my-bucket/my-path'
for json_line in open(source_uri, transport_params={"client": s3_client}):
    my_json = json.loads(json_line)

它使用流,因此您在读取文件时无需将整个文件保存在内存中。此外,它处理不同的扩展,所以我不需要关心 gz 解压缩。