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

使用Glue存Python列表到Amazon S3出现Body参数类型无效错误咨询

错误原因

boto3的put_object接口的Body参数仅支持字节、字节数组或类文件对象类型,无法直接接收Python列表。直接调用bytes(data_issues)会失败,因为Python无法直接将包含元组、异常实例的复合列表编码为字节流。

解决方案

分两种常用场景选择实现方式:

场景1:保存为人类可读的文本格式(适合日志审计场景)

先将列表中的每一项转为字符串,拼接后编码为UTF-8字节流再上传,示例代码如下:

import boto3

# 序列化列表为可读字符串后编码为字节
body_content = "\n".join([str(item) for item in data_issues]).encode("utf-8")

BUCKET = 'bucket_name'
s3 = boto3.client('s3')
keyid = 'keyID'

print("Uploading S3 object with SSE-KMS")
s3.put_object(
    Bucket=BUCKET,
    Key='data_issues_log.txt', # 建议添加txt后缀方便文件识别
    Body=body_content,
    ServerSideEncryption='aws:kms',
    SSEKMSKeyId=keyid
)
print("Saving to S3, Done")

场景2:保留Python对象结构(后续需要在Python环境中还原列表)

使用pickle模块序列化列表,可完整保留异常对象等结构,后续读取时可直接还原为原列表,示例代码如下:

import boto3
import pickle

# 序列化列表为pickle字节流
body_content = pickle.dumps(data_issues)

BUCKET = 'bucket_name'
s3 = boto3.client('s3')
keyid = 'keyID'

print("Uploading S3 object with SSE-KMS")
s3.put_object(
    Bucket=BUCKET,
    Key='data_issues.pkl', # 建议添加pkl后缀标识pickle序列化文件
    Body=body_content,
    ServerSideEncryption='aws:kms',
    SSEKMSKeyId=keyid
)
print("Saving to S3, Done")

如果需要读取pickle格式的文件,下载对象后调用pickle.loads(下载的字节内容)即可还原为原data_issues列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:51:01