使用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
相关产品推荐
相关产品推荐

