尝试将Python列表保存到S3存储桶时出错。

时间:2018-08-11 17:15:03

标签: python python-3.x amazon-web-services amazon-s3 aws-lambda

我已尽力研究此问题,包括堆栈溢出,但我只是不理解。我只想将Lambda函数的输出保存到S3存储桶。但是似乎S3不喜欢列表作为数据类型!

我得到一个错误:

botocore.exceptions.ParamValidationError: Parameter validation failed:
Invalid type for parameter Body, value:  type: <class 'list'>, valid
types: <class 'bytes'>, <class 'bytearray'>, file-like object

列表似乎不是S3存储桶的合适输出类型?这是我正在使用的代码:

bucket_name = "output-bucket"
file_name = "output.json"
s3 = boto3.resource('s3')
object = s3.Object(bucket_name, file_name)
object.put(Body=output_sentences)

我想我只是不了解它的工作方式...

2 个答案:

答案 0 :(得分:1)

它说您只能存储bytesbytearray

因此,您需要使用picklelist转换为bytes

import pickle

output_sentences = ['this', 'is', 'a', 'sentence']

# Convert your list to bytes
b = pickle.dumps(output_sentences)

# Save you object
object.put(Body=output_sentences)

再次加载byte对象后,可以使用以下方法转换回列表:

b = <load from S3>
read_sentence = pickle.loads(b)

答案 1 :(得分:0)

好的,谢谢。我设法做到了:

s3 = boto3.resource('s3')
object = s3.Object(bucket_name, file_name)
object.put(Body=(bytes(json.dumps(output_data, indent=2).encode('UTF-8'))))