从 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 解压缩。
我在 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 解压缩。