AWS Lambda中使用json.dump保存字典时报TypeError问题求助
问题原因与解决方法
核心错误点
- 文件模式不匹配:用
wb(二进制写入模式)打开文件后,json.dump输出的是字符串类型数据,和二进制写入要求的字节对象冲突,直接触发TypeError。 - 文件对象误用:后续调用
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
相关产品推荐
相关产品推荐

