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

AWS Lambda中使用json.dump保存字典时报TypeError问题求助

问题原因与解决方法

核心错误点

  1. 文件模式不匹配:用wb(二进制写入模式)打开文件后,json.dump输出的是字符串类型数据,和二进制写入要求的字节对象冲突,直接触发TypeError。
  2. 文件对象误用:后续调用open(temp_file,'rb')和os.remove(temp_file)时,传入的是已关闭的文件对象(with块结束后文件自动关闭),而非文件路径字符串,这会导致额外错误。

修正后的代码方案

方案1:修复文件操作逻辑

import json
import datetime
import boto3
import os

def upload(data):
    date = datetime.today().strftime('%Y%m%d') 
    s3 = boto3.resource('s3')
    file_path = '/tmp/output.json'
    
    # 用文本模式写入JSON,指定编码更规范
    with open(file_path, 'w', encoding='utf-8') as temp_file:
        json.dump(data, temp_file)    
    
    # 用文件路径打开文件,而非文件对象
    with open(file_path, 'rb') as data_:
        s3.put_object(
            Body=data_, 
            Bucket='bucket', # 替换为你的桶名
            Key=f'Solution/{date}/data.json'
        )
    
    # 删除文件时传入路径
    os.remove(file_path)

方案2:无需临时文件,内存直接处理(更高效)

Lambda临时存储虽然可用,但直接在内存中处理能减少IO开销:

import json
import datetime
import boto3
from io import BytesIO

def upload(data):
    date = datetime.today().strftime('%Y%m%d') 
    s3 = boto3.resource('s3')
    
    # 将JSON数据转为字节流,直接传入S3
    json_bytes = json.dumps(data).encode('utf-8')
    data_stream = BytesIO(json_bytes)
    
    s3.put_object(
        Body=data_stream, 
        Bucket='bucket', # 替换为你的桶名
        Key=f'Solution/{date}/data.json'
    )

关键说明

  • 文本模式w配合encoding='utf-8'是写入JSON文件的标准方式,避免字符串与字节的类型冲突。
  • 内存流方案跳过了临时文件的创建与删除,更适合Lambda这种无服务器环境,性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:42:16