【问题标题】:Read multi object json gz file from S3 in python在 python 中从 S3 读取多对象 json gz 文件
【发布时间】:2020-03-25 10:02:29
【问题描述】:

我在 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 对象的更好方法?

感谢您的帮助

【问题讨论】:

    标签: python json amazon-web-services amazon-s3 gzip


    【解决方案1】:

    经过一番研究,我发现库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 的解压。

    【讨论】:

    • 如果您的最终目标是创建一个 pandas 数据框,只需再添加一行:my_df = pd.DataFrame(my_json)
    【解决方案2】:

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

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

    【讨论】:

    • 我尝试了您的解决方案,但它返回“TypeError:需要一个类似字节的对象,而不是'_io.BytesIO'”。所以我尝试删除 BytesIO,但我仍然收到错误“json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 76100)”,因为我认为该文件包含多个 json 对象
    • 实际上,我再次查看了您的问题,并意识到我错误地假设压缩文件是 json 文件。然而,它不是,它只是一个包含多个 json 对象的文件。要么使用您现有的工作代码(您必须分别 json.loads 每个对象/行),或者将文件修改为有效的 json,例如[{...},{...},{...}] 而不是 {...} {...} {...} 然后您将能够一次加载所有内容。跨度>
    • 那么您上面描述的方式是最快的,因为虽然每一行都是有效的 json,但没有包含数组的行一起不是有效的 json,因此不能使用 json 对象的实用程序一起加载所以必须单独加载。
    猜你喜欢
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2017-04-21
    • 2021-01-02
    相关资源
    最近更新 更多