boto3 put_object with new key python

时间:2018-01-25 13:37:26

标签: python amazon-s3 boto3

我想使用boto3在S3中保存csv文件(“test.csv”)。 我的桶是“outputS3Bucket”,键是“folder / newFolder”。 我想检查“newFolder”是否存在,如果不存在则创建它。

import boto3
client = boto3.client('s3')
s3 = boto3.resource('s3')
bucket = s3.Bucket("outputS3Bucket")

result = client.list_objects(Bucket='outputS3Bucket',Prefix="folder/newFolder")

if len(result)==0:
    key = bucket.new_key("folder/newFolder")
    newKey = key + "/" + "test.csv"

client.put_object(Bucket="outputS3Bucket", Key=newKey, Body=content)
# put_object path: 's3://outputS3Bucket/folder/newFolder/test.csv'

我遇到的问题很少:

  1. 如果我没有写完整的密钥名称(例如“folder / ne”)并且有一个“neaFo”文件夹,它仍然表示它存在。
  2. key = bucket.new_key(“folder / newFolder”) AttributeError:'s3.Bucket'对象没有属性'new_key'

1 个答案:

答案 0 :(得分:1)

首先,根据boto3文档,我们首选使用新的API方法 - list_objects_v2()来列出存储桶的对象。

我建议使用一个简单的布尔函数来检查文件夹是否存在(使您的代码更清晰,更易读)。 对于问题1 ,您可以检查前缀是否以'/'字符结尾,如果没有则附加, - 这将确保您正在寻找 EXACT 匹配而不是< em>以开头。

示例功能:

def bucket_folder_exists(client, bucket, path_prefix):
    # make path_prefix exact match and not path/to/folder*
    if list(path_prefix)[-1] is not '/':
        path_prefix += '/'

    # check if 'Contents' key exist in response dict - if it exist it indicate the folder exists, otherwise response will be None
    response = client.list_objects_v2(Bucket=bucket, Prefix=path_prefix).get('Contents')

    if response:
        return True
    return False

示例实施:

if bucket_folder_exists(client, 'outputS3Bucket', 'folder/newFolder'):
    pass # Do something if folder already exist
else:
    pass # Do something if folder does not exist

关于第二个问题,我添加了评论 - 您的代码似乎提到了用作key = bucket.new_key("folder/newFolder")的存储桶变量\对象,但是bucket未在代码中的任何位置设置, - &gt;根据您获得的错误,它看起来像s3.Bucket对象,没有定义new_key属性。