我想使用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'
我遇到的问题很少:
key = bucket.new_key(“folder / newFolder”) AttributeError:'s3.Bucket'对象没有属性'new_key'
答案 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
属性。