首页 > 解决方案 > python - s3 Boto3 从大文件中每次迭代读取 N 行

问题描述

我正在尝试使用 python 在 N 行中处理来自 s3 的大文件的所有记录。我每次迭代都必须获取 N 行。每行都有一些 json 对象。

以下是我已经尝试过的一些事情:

1) 我尝试了这里提到的解决方案 ,将 csv 从 S3 流式传输到 Python ,但它在读取数据字节时破坏了我的 json 结构。

2)

obj = s3.get_object(Bucket=bucket_name, Key=fname)
data=obj['Body'].read().decode('utf-8').splitlines()

读取 100k 行的大文件需要更多时间。它将返回行列表,我们可以进一步迭代以从数据变量中获取行数。

标签: pythonamazon-s3boto3

解决方案


可能smart_open可以解决问题。

pip install smart_open[s3] 

安装后...

from smart_open import open

client = boto3.client("s3")
transport_params = {'client': client}
with open('s3://%s/%s' % (bucket_name, fname), 'wb', transport_params=transport_params, encoding='utf-8') as f:
    for line in f:
        print(json.loads(line))

你也可以使用iter_lines

obj = s3.get_object(Bucket=bucket_name, Key=fname)
for line in obj['Body'].iter_lines(chunk_size=1024, keepends=False):
    print(json.loads(line))

推荐阅读