Python操作AWS S3:如何正确读取按行存储JSON的文件
S3行存储JSON文件读取异常修复方案
问题根因
boto3调用get_object返回的response['Body']是StreamingBody流式对象,直接遍历该对象是按固定大小的字节块返回内容,不会自动按\n换行符拆分行,因此会出现多行数据被合并到同一个字节块的情况,最终导致JSON解析失败。
修复方案
根据文件体积可以选择两种适配方案:
场景1:文件体积较小(可完全加载到内存)
直接读取全量文件内容后按行拆分解析:
import boto3 import json s3 = boto3.client('s3') response = s3.get_object(Bucket=SOURCE_BUCKET, Key=key) # 读取全量内容解码后按换行拆分 content = response['Body'].read().decode('utf-8') for line in content.splitlines(): # 跳过空行避免解析异常 if line.strip(): data_json = json.loads(line)
场景2:文件体积较大(需流式读取避免内存溢出)
使用io.TextIOWrapper包装流式对象,实现自动按行迭代:
import boto3 import json import io s3 = boto3.client('s3') response = s3.get_object(Bucket=SOURCE_BUCKET, Key=key) # 包装为文本IO对象,原生支持按换行符读取行 with io.TextIOWrapper(response['Body'], encoding='utf-8') as f: for line in f: if line.strip(): data_json = json.loads(line)
补充说明
流式读取方案的内存占用仅和单行数据长度相关,不会受整个文件大小影响,适用于GB级以上的大文件读取场景。
内容的提问来源于stack exchange,提问作者Alex_Y
相关产品推荐
相关产品推荐

