我已尽力研究此问题,包括堆栈溢出,但我只是不理解。我只想将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)
我想我只是不了解它的工作方式...
答案 0 :(得分:1)
它说您只能存储bytes
或bytearray
。
因此,您需要使用pickle
将list
转换为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'))))