You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AWS Lambda中使用Python处理S3存储桶JSON文件的问题排查

解决AWS S3中JSON Lines文件的读取与遍历问题

你的核心问题在于S3存储的是JSON Lines格式的文件(每行一个独立JSON对象),但你尝试用解析单一JSON结构的方式处理整个文件内容,从而引发了各种异常。下面一步步帮你解决:

为什么之前的方法会出错?

  • 第一种方法的字符遍历问题:
    当你用json.loads(file_content_decoded)解析整个内容时,由于文件是多个JSON对象拼接(还夹杂#分隔符),整个字符串并非合法的单一JSON结构。这种情况下json.loads要么解析失败,要么在某些场景下把内容当成普通字符串处理,遍历字符串自然会逐个输出字符。

  • 第二种方法的TypeError:
    这个报错通常是因为JSON内容里包含了%这类格式化符号,json.loads解析时会误把它当成字符串格式化参数,导致参数不匹配。另外,整个内容不是合法JSON结构也是触发这类解析错误的常见原因。

正确的处理方式(和本地逻辑对齐)

你本地用for json_object in f逐行读取解析的思路完全正确,在S3中我们可以用iter_lines()方法实现同样的逐行处理逻辑,避免一次性加载整个文件:

import json
import boto3

s3 = boto3.resource('s3')
content_object = s3.Object(bucket, s3_key)

# 逐行读取S3文件内容,和本地open文件的遍历逻辑一致
for line in content_object.get()['Body'].iter_lines():
    if line:  # 跳过空行
        # 解码字节为字符串并去除首尾空白
        line_str = line.decode('utf-8').strip()
        # 处理内容中的#分隔符(如果你的文件用#分隔JSON对象)
        if '#' in line_str:
            line_str = line_str.split('#')[0].strip()
        # 解析单行JSON
        data = json.loads(line_str)
        # 遍历键值对(或仅遍历键,和你本地测试一致)
        for key, value in data.items():
            print(f"Key: {key}, Value: {value}")
        # 若只需遍历键,替换为下面的代码
        # for key in data:
        #     print(key)

额外说明

  • 如果你的S3文件是标准JSON Lines(每行纯JSON、无#分隔),可以去掉split('#')的处理逻辑。
  • iter_lines()无需把整个文件加载到内存,对大文件更友好,且和本地处理逻辑完全对齐。
  • 若不确定文件格式,可以先打印几行line_str查看实际内容,确认是否有多余的分隔符或注释。

内容的提问来源于stack exchange,提问作者IanPoli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:23:12